Rockyzsu/stock / 数据源

数据从哪来:14 个数据源、四类登录态与 Tushare 三路对照

这个仓库最有价值的部分其实是取数层——它把 A 股散户能用到的公开数据源几乎都对接了一遍:集思录(可转债)、宁稳网(可转债)、巨潮(公告)、东方财富(涨停/强势/炸板/跌停池)、同花顺(行业与资金流)、雪球(组合与私募)、上交所(开户数与 LOF 规模)、金融界(龙虎榜)、和讯(汇率)……

但每一类的「怎么登」都不一样:集思录要用 JS 加密用户名密码再 POST,宁稳网要过验证码,有的站点只需要拷 cookie,Tushare 则需要token。本站把源码里出现的每个数据源、每个端点、每类凭证都列了出来——这是官方 README 完全没有覆盖的部分。

14 类数据源4 类登录态Tushare 三条路线核验提交 9478dee
Tushare 官方 SDKts_token + ts.pro_api()
xcsc_tusharexc_token_pro + 自建 xc_server
网页抓取与登录态cookie / JS 加密 / 验证码
本地客户端接口127.0.0.1:7000/ths/hexin
依据源码 import 与 URL 扫描整理的取数通道示意;接口可用性随时间变化,以各站当前规则为准,非官方文档。

数据源清单

14 类数据源:取什么、从哪取、要不要登录

数据源取什么源码位置端点(源码中的真实 URL)登录态要求
集思录 jisilu.cn可转债列表、待发列表、公告、QDIIdatahub/jisilu.py、jisilu_bond_announcement.py、datahub/ninwen.py 之外的转债脚本/data/cbnew/cb_list/、/data/cbnew/cb_list_new/、/data/cbnew/pre_list/、/data/cbnew/announcement_list/、/data/qdii/qdii_list/账号密码(客户端 JS 加密)
宁稳网 ninwin.cn可转债全量数据datahub/ninwen.py/index.php?m=u&c=login、?m=cb&a=cb_all、?m=verify&a=get账号 + 验证码识别
巨潮资讯 cninfo.com.cn上市公司公告(含 PDF 下载)datahub/jucao_announcement.py/new/hisAnnouncement/query、static.cninfo.com.cn无(公开接口,需处理分页)
东方财富 push2ex涨停池、强势池、炸板池、跌停池、昨日涨停池datahub/dfcf_hot_block.py、datahub/zdt.py/getTopicZTPool、/getTopicQSPool、/getTopicZBPool、/getTopicDTPool、/getYesterdayZTPool无,但需先取 ut 参数
东方财富 dcfm机构调研、限售解禁datahub/public_private_fund_members.py 等dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get无(带 token 查询参数)
同花顺 10jqka行业分类、行业资金流、板块明细datahub/industry_info/thshy_*.py(三个脚本)q.10jqka.com.cn/thshy/、data.10jqka.com.cn/funds/hyzjl/cookie + 缺失模块依赖
同花顺客户端本地客户端行情接口datahub/industry_info/ 相关脚本http://127.0.0.1:7000/ths/hexin需本机安装并运行同花顺客户端
雪球 xueqiu.com组合持仓、策略、收藏、私募、蛋卷基金fund/xueqiu_private_fund.py、datahub/xueqiu_group.py、datahub/xueqiu_sync_portfolio.py/snowman/login、/cubes/rebalancing/create.json、/v5/stock/quote.json、/strategy/cookie(xc_token_pro 相关配置)
上交所 sse.com.cn开户数、LOF 份额规模market/securities_account_opening.py、fund/fund_share_update.pyquery.sse.com.cn/commonQuery.do + sqlId=COMMON_SSE_TZZ_M_ALL_ACCT_C / COMMON_SSE_FUND_LOF_SCALE_CX_S无(JSONP 形式)
深交所场内基金份额fund/fund_share_monitor.py深交所基金份额查询接口无
金融界 jrj.com.cn涨停数据、龙虎榜明细datahub/zdt.py、longhuban.pyhome.flashdata2.jrj.com.cn/limitStatistic/ztForce/、stock.jrj.com.cn/action/lhb/...无
和讯 hexun美元兑人民币汇率datahub/foreignexchange.pydata.bank.hexun.com/other/cms/foreignexchangejson.ashx无(JSONP 形式)
聚币 jubi.com山寨币行情(已停更)jubi.py/api/v1/ticker、/depth、/orders、/trade_list无;脚本自述「python2 代码,网站已停止更新」
港股打新(aastocks / lianghuaipo)港股 IPO 列表与暗盘hk_stock/aastock_new_stock.py、hk_stock/new_stock_release.pyaastocks.com/sc/stocks/market/ipo/listedipo.aspx、api2.lianghuaipo.com/hk_ipo/get_paged_listed_stock_list无(aastocks 侧用 selenium)
ARK / 天天基金 / 蛋卷ETF 持仓、新发基金、基金净值fund/ark_funds.py、fund/ttjj.py、fund/danjuan_fund.py各站接口;ARK 数据落 MongoDB天天基金与蛋卷需 execjs 处理参数

接口可用性边界:上表是源码里出现过的端点,不是「今天仍然可用」的承诺。这些站点多数会改版、加反爬或调整权限,本站没有在 2026-10-09 逐条请求验证过,使用前请以各站当前规则为准。清理规律是一样的:先能在浏览器里正常访问,再把 cookie / token 搬进配置。

登录态

四类登录态怎么实现:两类当前是断的

登录态类型代表站点实现方式凭证存放位置失败时的典型现象
用户名 + 密码,客户端 JS 加密集思录datahub/jsl_login.py 用 execjs 执行 js_file/encode_jsl.js,调用 jslencode(text, key) 加密后再 POSTconfig.json 的 jsl_monitor.JSL_USER / JSL_PASSWORD登录返回 errno != 1,脚本主动 raise ValueError('登录失败')
用户名 + 密码 + 验证码宁稳网datahub/ninwen.py 先取 csrf_token,再下载验证码图片,调用外部 OCR 接口识别验证码识别服务的账号/签名/URL 写在 datahub/validate_key.py(内容为空字符串)因 validate_key.url 为空,OCR 请求会失败
纯 cookie同花顺行业、部分雪球接口configure/util.py 的 read_web_headers_cookies() 从 web_headers.json 读取期望文件 configure/web_headers.json(仓库中不存在)FileNotFoundError;另该函数还有赋值 bug,cookies 永远返回 None
TokenTushare(官方与第三方两条)官方用 ts.set_token(ts_token);第三方用 xc.set_token(xc_token_pro) + xc.pro_api(env='prd', server=xc_server)config.json 的 ts_token / xc_token_pro / xc_server无 token 时接口直接报权限或参数错误
券商客户端本地会话easytrader / PTradetrader/auto_trader.py 用 easytrader.use('gj_client') 后 prepare('user.json')user.json(被 .gitignore 排除)文件不存在时 prepare() 报错
本机客户端 HTTP 接口同花顺客户端http://127.0.0.1:7000/ths/hexin无凭证,但要本机进程在跑连接被拒绝

四类登录态里,两类当前是断的:宁稳网的验证码 OCR 依赖向作者索取的账号(validate_key.py 里三个字段都是空字符串);同花顺/雪球所依赖的 configure/web_headers.json 在仓库中不存在。这两条都要自己补,不是配置填错的问题。

Tushare 三路

同一个 Tushare,仓库里为什么用了三条不同路线

路线怎么调配置字段在 requirements.txt 里吗适用场景
官方 SDK(老接口)import tushare as ts → ts.get_k_data()、ts.get_stock_basics()、ts.get_today_all()、ts.get_apis() 等ts_token(common/TushareUtil.py 里 ts.set_token())在仓库历史代码的主力路径;接口风格属早期版本
官方 SDK(Pro 接口)ts.pro_api() 后调 pro.daily()、pro.stock_basic()、pro.trade_cal()、pro.repurchase()、pro.stk_account()同上在新写的脚本用它;需要 Pro 积分
第三方封装 xcsc_tushareimport xcsc_tushare as xc → xc.set_token() + xc.pro_api(env='prd', server=xc_server)xc_token_pro + xc_server不在指向一个自建/私有服务器而非官方 API 域名;common/Base.py、configure/settings.py、datahub/repurchase.py 用它

第三条路线最需要留意:xcsc_tushare 不在依赖清单里,且它的 server 参数是可配置的——也就是说这些脚本访问的不是官方 api.tushare.pro,而是配置里指定的那台服务器。使用前请自行确认该来源的合规性与稳定性;本站不对其可用性做任何判断。

老接口 vs 新接口

Tushare 老接口与新接口的区别:不是改名,是换模型

老接口(仓库大量使用)出现的文件新接口对应写法迁移时的注意点
ts.get_k_data()select_stock.py、new_stock_break.py、StockAnalyze.py、store_data.pypro.daily() / pro.daily_basic()参数名与返回字段都不同:老接口带 code,新接口用 ts_code;复权参数也要重写
ts.get_stock_basics()select_stock.py、k_line.py、new_stock_break.py、stock_check.pypro.stock_basic()老接口一次返回全市场快照;新接口分字段拉取,且 pe/area 等字段要另取
ts.get_today_all()datahub/daily_stock_market_info.py、utils/push_msn.py、recordMyChoice.pypro.daily() 逐日或第三方行情老接口返回当日全市场行情,新接口没有等价单调用法
ts.get_hist_data()select_stock.py、new_stock_break.py(注释中)pro.daily()返回的索引名与列名都不同
ts.get_today_ticks()monitor/big_deal.py、stock_check.py逐笔接口(Pro 侧另有权限要求)大单监控依赖逐笔成交,权限变更会直接让该功能失效
ts.get_apis() / ts.quotes() / ts.close_apis()monitor/realtime_monitor_ts.py、plot_line.py、recordMyChoice.py、yesterday_zt_monitor.py—这一组是新浪行情通道,不是 Pro 接口;迁移时不能简单换名字,要换成真正的行情源
ts.get_realtime_quotes()monitor/ceiling_break.py、utils/push_msn.py、real_time_big_deal.py—同为新浪通道;封板监控读 b1_v(买一量)就靠它
ts.pledged_detail() / ts.stock_pledged()pledged_validation.py股权质押属 Pro 的高积分接口老脚本用 ts 命名空间直接调,Pro 侧需要 pro 对象
ts.is_holiday()recordMyChoice.py可用 pro.trade_cal() 自行判断新接口返回的是交易日历表,需要自己转成布尔判断

「Tushare 历史教程能不能照搬」的答案是:不能。这个仓库的注释里写着「适用 tushare 0.7.5」,而依赖清单写的是裸 tushare(不锁版本)。老接口与新接口不是改名关系,返回结构、参数命名、权限模型都不同;其中 ts.get_apis() 一组属于新浪行情通道,需要整体替换而不是重命名。本站不逐条断言各接口的下线时间——那需要逐条查官方公告,请以 Tushare 官方当前文档为准。

采集到落库

抓到之后写到哪里:落点与重复运行的行为

采集脚本抓到之后写到哪落库方式重复运行会怎样
datahub/jisilu.pydb_stock.tb_bond_jisilu(日库 db_jisilu)to_sql(..., if_exists='replace'),字段 可转债代码 指定 VARCHAR(10)会整表覆盖,历史数据丢失
datahub/jisilu.py(公告)db_stock.tb_bond_releasecreate table if not exists + update / insert 分支先查再写,相对安全
datahub/zdt.pydb_zdt.{日期}{后缀}to_sql(..., if_exists='fail')表已存在直接抛错,同一天无法重跑
stockInfo.pyElasticsearch 索引 cnstockes.index(index='cnstock', doc_type='doc', ...)重复写入会产生重复文档(需自行去重)
fund/ark_funds.pyMongoDBinsert 文档取决于实现的去重逻辑
utils/delivery_order.pydb_stock.tb_delivery_gj_django / tb_delivery_hb_django按券商分表写入,先 del df['股东代码'] 等列重复导入会产生重复交割记录
store_data.pySQLite 文件 testdb.db,表 newtableto_sql(..., flavor='sqlite')flavor 参数在 pandas 1.0 已移除,现代 pandas 直接报错

「抓到了写哪」这件事没有统一层。每个脚本自己决定库名、表名与写入模式,所以同一个数据源在不同脚本里可能落到不同的表。改造时的建议:先在你自己的库里建表,再把 to_sql 的目标改成你的库,不要直接沿用 if_exists='replace' 的写法——它会静默清空历史。

自查清单

要自己接一个新数据源,按什么顺序做

接入一个新数据源前的自查清单

  1. 在浏览器里手动访问目标端点,确认当前是否需要登录、是否有验证码、返回是否仍是 JSON。预期输出:能在浏览器里看到结构化数据。
  2. 打开浏览器开发者工具,把请求头与 cookie 完整复制出来。预期输出:一份含 User-Agent、Referer、Cookie 的请求头。
  3. 判断登录态该放在哪:如果是长期 cookie,写进 configure/web_headers.json(需自己新建,仓库里没有);如果是账号密码且有加密,参照 datahub/jsl_login.py 的做法。预期输出:凭证不落在代码里、也不进 git。
  4. 决定落库点:MySQL(结构化表格)、MongoDB(嵌套文档)、Elasticsearch(需要检索)还是仅打印。预期输出:明确的库名与表名,并且不用 if_exists='replace'。
  5. 用一年的历史数据跑一次完整链路,核对行数与关键字段。预期输出:行数与站点上显示的数量级一致。
  6. 把这次的分页、限频、验证码、字段变化记录下来。预期输出:一份可交接的接入笔记。

FAQ

关于 Rockyzsu/stock 的常见问题

这个仓库要花钱买数据吗?
代码本身不花钱,但数据源有各自的规则。Tushare 的部分数据需要 Pro 权限与积分;集思录登录后部分数据有访问限制;宁稳网的验证码识别依赖向作者索取的第三方服务账号。另外还有自建数据库与服务器的成本。本仓库 README 里另有券商开户与费率相关内容,本站不转发、不引用。以各数据源当前官方规则与许可原文为准。
Tushare 的老接口(ts.get_k_data 等)现在还能用吗?
本站不做断言——那需要逐条查官方公告,而本站的原则是不编造时间点。可以确定的是:①老接口与新 Pro 接口不是改名关系,返回结构与参数命名都不同;②ts.get_apis() / ts.quotes() 一组属于新浪行情通道,需要整体替换;③select_stock.py 的注释里写的是「适用 tushare 0.7.5」,属早期版本。请以 Tushare 官方当前文档为准。
第三条路线 xcsc_tushare 是什么?
它是仓库里使用的第三方 tushare 封装,用法是 xc.set_token(xc_token_pro) 加 xc.pro_api(env='prd', server=xc_server)。关键在于 server 是可配置的,也就是说这些脚本访问的不是官方 API 域名,而是配置里指定的那台服务器。它不在 requirements.txt 里,本站不对其来源、合规性与稳定性做任何判断,请自行核实。
集思录要登录,登录麻烦吗?
比普通表单登录麻烦一档:datahub/jsl_login.py 不是直接 POST 用户名密码,而是先用 execjs 执行仓库里的 js_file/encode_jsl.js,调用 jslencode(text, key) 对用户名和密码做客户端加密,再把密文发到 /account/ajax/login_process/。所以你需要本地有 Node 运行时,否则 execjs 无法工作。另外这份脚本里的加密 key 是硬编码在源码中的。
宁稳网那两个脚本为什么直接跑不了?
因为它依赖验证码识别:脚本会下载验证码图片,然后 POST 到 validate_key.url 去识别。而 datahub/validate_key.py 里 username、password、sign、url 四个字段全是空字符串,注释写的是「找群主要 公众号:可转债量化分析」。也就是说这个能力预设了你要向作者索取服务账号,开箱不可用。
行情数据是实时的吗?
分三类:①实时轮询——monitor/realtime_monitor_ts.py 用 ts.quotes() 循环拉新浪行情;②日频落库——datahub/ 下多数脚本按日采集后写库,供选股与分析消费;③事件驱动——涨停池、公告、龙虎榜按事件抓取。需要「毫秒级」的场景不在这个项目的设计范围内。以源码中的轮询参数为准。
接口突然失效了怎么办?
按三步排查:①先在浏览器里手动访问同一端点,确认是「站点变了」还是「你的凭证过期了」;②如果是站点改版,看返回结构与源码里解析的字段名差异;③如果是凭证,重新导出 cookie 或 token。这类脚本的寿命完全取决于上游站点,所以把「数据源可用性检查」做成独立脚本、每天跑一次,比事后救火省力得多。

接下来读哪一页?

数据接进来之后,下一步是拿它做筛选。选股分析页把因子筛选、涨停池、K 线形态与回测口径四条链路拆开讲,并说明每条链路的可信度边界。