你还在用炒股软件一个个点“市盈率<20”、“ROE>15%”然后手动导出数据?太慢了!隔壁的量化大佬早就不这么玩了。今天教你一招,让Python帮你自动抓取海量选股数据,效率提升100倍!
🧐 等等,同花顺问财是什么?
先给不熟悉的朋友科普一下。
同花顺问财(i问财)是同花顺旗下的一款智能投研搜索工具。它最牛的地方是:你只需要输入一句大白话,它就能帮你搜出符合条件的股票!
比如你想找:
直接在问财搜索框里输入这些句子,它就会返回一张表格,里面有所有符合条件的股票,以及相关字段的数据。
是不是很强大?但问题来了——手动搜索太累人了!
如果你想做量化分析,需要每天批量获取数据,或者想把这些数据直接整合到你的Python策略里,手动复制粘贴简直是一场噩梦。
这时候,就需要我们的主角登场了——pywencai!
🚀 pywencai是什么?
简单粗暴地说,pywencai 是一个 Python 版的问财助手。它让你可以在 Python 里直接输入那句大白话,然后自动抓取问财返回的数据,并且整理成 Pandas DataFrame 格式,供你随意分析。
有了它,你的选股流程就从“手动挡”升级成了“自动巡航”:
之前:
打开网页 → 输入条件 → 翻页 → 复制数据 → 粘贴到Excel → 整理格式 → 导入Python
现在:
运行一行Python代码 → 直接得到DataFrame → 开搞分析!
🛠️ 准备工作:就三步,超简单!
1. 安装 pywencai
打开cmd终端,输入:
2. 安装 Node.js
pywencai 底层需要执行一些JavaScript代码来获取数据,所以需要安装 Node.js (v16+)。去官网(nodejs.org)下载安装包,一路下一步就行。装完就不用管了,它会在后台默默工作。3. 获取问财的“通行证”——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. 查询语法随心所欲
问财支持的自然语言,这里基本都支持。随便举个例子:
你可以把任何平时在问财搜索框里输入的话,直接塞进 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)
这个脚本做了什么?
定义选股条件:用问财的自然语言描述策略(竞价异动类型包含竞价抢筹,集合竞价评级包含看多,dde大单净额大于0,今日涨幅大于3%,沪深A股,非ST,非次新股)。
获取数据:pywencai.get 返回DataFrame,我们只取股票代码列表。
保存结果:将股票列表和当前时间戳存为JSON,便于其他程序(如交易终端)读取。
定时循环:使用 schedule 库每60秒跑一次,确保数据实时更新。
额外功能:还可以用 akshare 获取昨日涨停股票,同样保存下来,为复盘提供素材。
为什么是30秒?
因为问财的数据本身更新频率很快(尤其是盘中异动),如果你在盯盘,30秒刷新一次能让你及时发现符合条件的股票。当然,为了避免被封,你也可以把间隔调成60秒或更长。
这个脚本还能干嘛?
盘中自动预警:配合钉钉或者微信机器人,一旦选股结果出现新的股票,立刻推送到手机。
盘后复盘:把每次保存的结果合并分析,看看策略的胜率。
多策略并行:你可以定义多个不同的问句,分别保存到不同文件,一键管理所有选股模型。
⚠️ 温馨提示:做个有礼貌的采集者
控制频率:别太快!设置定时任务间隔长一点,建议至少10秒以上,避免短时间内大量请求被封IP。尊重服务器资源,才能长久使用。
控制数量:不要同时开启太多采集脚本。如果你有多个选股策略,尽量合并查询,或者错开时间运行。开太多脚本同时抓取,相当于对服务器进行DDoS攻击,很容易被拉黑。
仅限个人研究:本工具仅供个人学习、量化策略研究和复盘使用,请勿用于商业用途。遵守同花顺的用户协议,合理使用。
💬 互动:你的选股金句是什么?
现在你已经会了用 Python 自动抓取问财数据,还能盘中实时选股,是不是跃跃欲试?
你平时最喜欢用哪些条件来选股?在评论区分享一下你的“选股金句”(例如:“基金连续加仓3个季度且大股东增持”),点赞最高的三位,我们将专门写一篇文章,教你怎么用 pywencai 配合迅投qmt实现一个完整的股票量化交易策略!
关注「easyquant实战」每期一个量化小技巧,让你的投资更智能。下期见!👋