当前位置:首页>python>告别手动选股!用这个Python神器,让同花顺问财自动把数据喂到你嘴边

告别手动选股!用这个Python神器,让同花顺问财自动把数据喂到你嘴边

  • 2026-08-22 08:49:26
告别手动选股!用这个Python神器,让同花顺问财自动把数据喂到你嘴边

你还在用炒股软件一个个点“市盈率<20”、“ROE>15%”然后手动导出数据?太慢了!隔壁的量化大佬早就不这么玩了。今天教你一招,让Python帮你自动抓取海量选股数据,效率提升100倍!


🧐 等等,同花顺问财是什么?

先给不熟悉的朋友科普一下。

同花顺问财(i问财)是同花顺旗下的一款智能投研搜索工具。它最牛的地方是:你只需要输入一句大白话,它就能帮你搜出符合条件的股票!

比如你想找:

  • “大单连续3天流入的股票”

  • “2025年净利润增长超过50%且市盈率小于20的股票”

  • “商业航天概念里市值大于100亿的龙头股票”

直接在问财搜索框里输入这些句子,它就会返回一张表格,里面有所有符合条件的股票,以及相关字段的数据。

是不是很强大?但问题来了——手动搜索太累人了!

如果你想做量化分析,需要每天批量获取数据,或者想把这些数据直接整合到你的Python策略里,手动复制粘贴简直是一场噩梦。

这时候,就需要我们的主角登场了——pywencai!


🚀 pywencai是什么?

简单粗暴地说,pywencai 是一个 Python 版的问财助手。它让你可以在 Python 里直接输入那句大白话,然后自动抓取问财返回的数据,并且整理成 Pandas DataFrame 格式,供你随意分析。

有了它,你的选股流程就从“手动挡”升级成了“自动巡航”:

之前:

打开网页 → 输入条件 → 翻页 → 复制数据 → 粘贴到Excel → 整理格式 → 导入Python

现在:

运行一行Python代码 → 直接得到DataFrame → 开搞分析!


🛠️ 准备工作:就三步,超简单!

1. 安装 pywencai

打开cmd终端,输入:

pip install pywencai

2. 安装 Node.js

pywencai 底层需要执行一些JavaScript代码来获取数据,所以需要安装 Node.js (v16+)。去官网(nodejs.org)下载安装包,一路下一步就行。装完就不用管了,它会在后台默默工作。

3. 获取问财的“通行证”——Cookie(必看!)

由于问财最近加强了安全验证,现在必须提供有效的Cookie才能正常访问。获取方法超级简单,不用翻请求头,直接在浏览器控制台输入一行代码就行:

  • 用浏览器打开 www.iwencai.com,登录你的同花顺账号(没账号就注册一个,免费的)。

  • 登录成功后,按 F12 打开开发者工具。

  • 点击顶部的 Console(控制台) 标签。

  • 在控制台里输入下面这行代码,然后按回车:

document.cookie
  • 控制台会输出一大串字符,全部复制下来,这就是你的Cookie!

🚨 注意:Cookie 有时效性,过期了重复以上步骤就行。建议用环境变量保存,别直接写在代码里。另外,复制的时候要完整,别漏掉开头的字符。


💻 实战演练:三行代码,让数据自动送到手!

案例1:找出“MACD金叉 + 大单流入”的潜力股

import pywencai# 把刚才复制的Cookie贴在这里MY_COOKIE = 'your_cookie_string_here'# 就这一行!df = pywencai.get(    query='macd金叉,大单流入',  # 你想搜的任何条件    cookie=MY_COOKIE)# 看看结果print(df.head())print(f"共找到 {len(df)} 只股票")
返回的 df 是一个标准的 Pandas DataFrame,你可以直接进行筛选、排序、画图,或者扔进机器学习模型里。爽不爽?

案例2:获取全量“商业航天概念+营收高增长”数据

df = pywencai.get(    query='商业航天概念,营收增长大于50%',    cookie=MY_COOKIE,    loop=True,        # 开启自动翻页,抓取全部数据    perpage=100,      # 每页最多100条    sleep=1           # 每页间隔1秒,做个体贴的爬虫)print(df.head())print(f"共找到 {len(df)} 只股票")

🔧 高阶玩法:让代码更智能

1. 自动重试

网络波动导致请求失败?设置 retry 参数,它会自动重试。

df = pywencai.get(    query='kdj金叉 主力净流入>5000万',    cookie=MY_COOKIE,    retry=5   # 失败后重试5次)

2. 自定义排序

想按某个指标从高到低排序?

df = pywencai.get(    query='创新药概念,研发费用占比>10%',    cookie=MY_COOKIE,    sort_key='研发费用占比',    sort_order='desc'   # 降序)

3. 查询语法随心所欲

问财支持的自然语言,这里基本都支持。随便举个例子:

  • 'macd金叉 rsi小于30'

  • '新能源汽车 毛利率>20% 且 负债率<50%'

  • '2024年一季报净利润增长大于50% 且 北向资金连续3日净流入'

你可以把任何平时在问财搜索框里输入的话,直接塞进 query 参数里。


🤖 实战进阶:盘中实时全市场选股

光会单次抓取还不够,真正的量化玩家要的是自动化。下面我们来看一个真实跑在服务器上的脚本,它每隔60秒自动执行一次问财选股,并且把结果保存下来,供盘中决策参考。

import osimport timeimport jsonimport pywencaiimport scheduleimport akshare as akimport pandas as pdimport chinese_calendar as ccfrom datetime import datetime, timedeltadef read_json_file(file_path: str) -> dict:    """        读取json文件        Args:            file_path: 文件路径        Returns:            json_object: json对象        """    try:        with open(file_path, "r", encoding="utf-8") as f:            json_object = json.load(f)    except Exception as e:        json_object = {}    return json_objectdef write_json_file(data: dict, file_path: str):    """    写入json文件    Args:        data: 需要写入的数据        file_path: 文件路径    """    os.makedirs(os.path.dirname(file_path), exist_ok=True)    with open(file_path, "w", encoding="utf-8") as f:        json.dump(data, f, ensure_ascii=False, indent=2)def get_previous_day():    today_date = datetime.now().date()    previous_day = today_date - timedelta(days=1)    while previous_day.weekday() >= 5 or cc.is_holiday(previous_day):        previous_day -= timedelta(days=1)    return previous_daydef get_pre_upstop_stock_dict():    try:        stock_zt_pool_previous_em_df = ak.stock_zt_pool_previous_em(            date=datetime.now().strftime("%Y%m%d"))        pre_upstop_stock_list = [            f"{stockcode}.SH" if stockcode.startswith("6") else            f"{stockcode}.SZ" if stockcode.startswith(                ("0", "3")) else f"{stockcode}.BJ"            for stockcode in stock_zt_pool_previous_em_df["代码"]        ]        # 过滤.BJ股票        pre_upstop_stock_list = [            stock for stock in pre_upstop_stock_list            if not stock.endswith(".BJ")        ]        return {            "股票列表": pre_upstop_stock_list,            "统计日期": datetime.now().strftime("%Y%m%d%H%M%S")        }    except Exception as e:        print(f"获取昨日涨停股票列表失败: {e}")        return {"股票列表": [], "统计日期": datetime.now().strftime("%Y%m%d%H%M%S")}def save_pre_upstop_stock_data(save_path: str):    pre_upstop_stock_dict = get_pre_upstop_stock_dict()    write_json_file(data=pre_upstop_stock_dict, file_path=save_path)def get_iwencai_data_dict(cookie: str, question: str) -> dict:    try:        res = pywencai.get(query=question,                           loop=True,                           pro=True,                           cookie=cookie,                           no_detail=True)        return {            "股票列表": res["股票代码"].to_list(),            "统计日期": datetime.now().strftime("%Y%m%d%H%M%S")        }    except Exception as e:        print(f"获取i问财数据失败: {e}")        return {"股票列表": [], "统计日期": datetime.now().strftime("%Y%m%d%H%M%S")}def save_iwencai_selfstock_data(cookie: str, question: str, save_path: str):    iwencai_selfstock_data = get_iwencai_data_dict(cookie=cookie,                                                   question=question)    write_json_file(data=iwencai_selfstock_data, file_path=save_path)if __name__ == "__main__":    strategy_name = "盘中实时选股"    # 数据文件路径    folder_path = os.path.join("D:", "交易策略文件", strategy_name)    # 确保文件夹存在    os.makedirs(folder_path, exist_ok=True)    # i问财cookie    iwencai_cookie = "your_cookie "    # 保存昨日涨停数据    save_pre_upstop_stock_data(os.path.join(folder_path, "昨日涨停数据.json"))    print("昨日涨停数据已保存")    # 定义i问财选股结果数据保存路径    iwencai_selfstock_data_path = os.path.join(folder_path, "i问财选股结果.json")    # 创建一个不带参数的包装函数,用于定时任务    def save_iwencai_selfstock_data_job():        question = "竞价异动类型包含竞价抢筹,集合竞价评级包含看多,dde大单净额大于0,今日涨幅大于3%,沪深A股,非ST,非次新股"        save_iwencai_selfstock_data(cookie=iwencai_cookie,                                    question=question,                                    save_path=iwencai_selfstock_data_path)        print(f"i问财选股结果已保存: {datetime.now().strftime('%H:%M:%S')}")    # 立即执行一次i问财选股结果保存    save_iwencai_selfstock_data_job()    # 设置定时任务 - 每30秒执行一次    interval_seconds = 30  # 可以修改这个值来调整执行间隔    schedule.every(interval_seconds).seconds.do(        save_iwencai_selfstock_data_job)    print("定时任务已启动,每分钟保存i问财选股结果")    while True:        schedule.run_pending()        # 显示下一次执行时间        next_run = schedule.next_run()        if next_run:            remaining = next_run - datetime.now()            print(f"\r下一次i问财选股结果获取将在 {int(remaining.total_seconds())} 秒后",                  end="")        time.sleep(1)

这个脚本做了什么?

  1. 定义选股条件:用问财的自然语言描述策略(竞价异动类型包含竞价抢筹,集合竞价评级包含看多,dde大单净额大于0,今日涨幅大于3%,沪深A股,非ST,非次新股)。

  2. 获取数据:pywencai.get 返回DataFrame,我们只取股票代码列表。

  3. 保存结果:将股票列表和当前时间戳存为JSON,便于其他程序(如交易终端)读取。

  4. 定时循环:使用 schedule 库每60秒跑一次,确保数据实时更新。

  5. 额外功能:还可以用 akshare 获取昨日涨停股票,同样保存下来,为复盘提供素材。

为什么是30秒?

因为问财的数据本身更新频率很快(尤其是盘中异动),如果你在盯盘,30秒刷新一次能让你及时发现符合条件的股票。当然,为了避免被封,你也可以把间隔调成60秒或更长。

这个脚本还能干嘛?

  • 盘中自动预警:配合钉钉或者微信机器人,一旦选股结果出现新的股票,立刻推送到手机。

  • 盘后复盘:把每次保存的结果合并分析,看看策略的胜率。

  • 多策略并行:你可以定义多个不同的问句,分别保存到不同文件,一键管理所有选股模型。

⚠️ 温馨提示:做个有礼貌的采集者

    • 控制频率:别太快!设置定时任务间隔长一点,建议至少10秒以上,避免短时间内大量请求被封IP。尊重服务器资源,才能长久使用。

    • 控制数量:不要同时开启太多采集脚本。如果你有多个选股策略,尽量合并查询,或者错开时间运行。开太多脚本同时抓取,相当于对服务器进行DDoS攻击,很容易被拉黑。

    • 仅限个人研究:本工具仅供个人学习、量化策略研究和复盘使用,请勿用于商业用途。遵守同花顺的用户协议,合理使用。

    💬 互动:你的选股金句是什么?

    现在你已经会了用 Python 自动抓取问财数据,还能盘中实时选股,是不是跃跃欲试?

    你平时最喜欢用哪些条件来选股?在评论区分享一下你的“选股金句”(例如:“基金连续加仓3个季度且大股东增持”),点赞最高的三位,我们将专门写一篇文章,教你怎么用 pywencai 配合迅投qmt实现一个完整的股票量化交易策略!


    关注「easyquant实战」每期一个量化小技巧,让你的投资更智能。下期见!👋

    最新文章

    随机文章