新浪数据源
概述
新浪(quotes.sina.cn / vip.stock.finance.sina.com.cn / finance.sina.com.cn / money.finance.sina.com.cn / hq.sinajs.cn)在本项目承担主源与兜底两类角色,覆盖 8+ 实现文件、横跨财报/行情/期货/跨市场四大领域。与东财、腾讯分属不同域名与风控面,是降级链中最可靠的兜底层(风控最宽松、历史最稳定)。
| 角色 | 数据 | 何时使用 | 优先级 |
|---|---|---|---|
| 财报三表 + 关键指标 | 利润表/资产负债表/现金流量表/gjzb | 主源(fin_statement_sync 20:30 全市场批量) | 主源 |
| 复权因子 | 前复权/后复权因子 | 主源("不复权价 + 因子"契约的因子来源) | 主源 |
| 北交所 K 线 | 不复权日线 | 主源(腾讯 fqkline 不覆盖北交所) | 主源 |
| 跨市场数据 | A50 期货 + 离岸人民币 (CNH) | 唯一源(腾讯全球目录无此品种) | 唯一源 |
| 国内期货 | 主力合约行情 | 主源(多品种并行拉取) | 主源 |
| ETF 历史 K 线 | 不复权日线(约 2000 根) | 兜底(腾讯 fqkline 为 ETF 主源) | 兜底 |
| 资金流 | 日度单股净额 | 东财熔断/限流后的备用源 | 兜底 |
| 行业涨跌幅 | newSinaHy.php 全行业 | 降级源 | 降级 |
| 市场概览 | 大盘指数/分时 | 兜底(腾讯指数主源) | 降级 |
| 美元指数 | DXY 实时 | 东财不可用时的兜底 | 降级 |
实现位置
核心文件(8+ 模块)
| 文件 | 职责 | 关键函数 |
|---|---|---|
data_sources/sina_source.py | 行情/K线/复权因子/行业 | get_daily_kline() / get_sina_adjust_factor() / get_index_daily() / get_market_spot() / get_industry_boards() / apply_adjust_factor() |
data_sources/signal_layer.py | 财报三表(单股 + 历史) | sina_financial_report() / sina_financial_report_history() / _sina_fflow_days() |
data_manager/downloaders/sina_batch.py | 全市场批量 gjzb | download_sina_financial_indicator_all()(4 并发 + 0.3s 节流 + 分块熔断) |
data_manager/downloaders/sina_stmt_batch.py | 批量财报三表 | download_sina_statements_all()(1200 只/轮,fin_statement_sync 20:30 调用) |
data_sources/cross_market_data.py | A50 期货 + 离岸人民币 | sina_cross_market_quotes() / sync_cross_market_from_sina() |
data_sources/futures_sources.py | 国内期货主力合约 | _fetch_sina_futures_multi() |
data_sources/fund_sources.py | ETF 行情兜底 | _fetch_etf_quote_sina() |
data_sources/macro_sources.py | 美元指数兜底 | _dxy_from_sina() |
data_sources/real_data_source.py | RealDataSource 内联版 | _get_sina_financial_report() |
market_data_service/providers_eastmoney.py | 资金流备用源(历史归置) | sina_fund_flow()(与东财同仓) |
API 接口
财报三表 + 关键指标
https://quotes.sina.cn/cn/api/openapi.php/CompanyFinanceService.getFinanceReport2022
- 参数:
paperCode(带市场前缀sh/sz/bj)、source(lrb利润表 /fzb资产负债表 /llb现金流量表 /gjzb关键指标)、type=0、page=1、num=N - 返回:
report_list结构,解析后为[{report_period, items: {科目: 值}}] - 消费方:
- 单股:
signal_layer.py::sina_financial_report()(按需拉取 + 缓存) - 全市场批量:
sina_batch.py::download_sina_financial_indicator_all()(gjzb 40 期,4 并发 + 0.3s 节流 + 分块熔断) - 财报三表批量:
sina_stmt_batch.py::download_sina_statements_all()(1200 只/轮,20:30fin_statement_sync调用)
- 单股:
复权因子
https://finance.sina.com.cn/realstock/company/{symbol}/qfq.js # 前复权因子
https://finance.sina.com.cn/realstock/company/{symbol}/hfq.js # 后复权因子
- 因子文件是纯 JS 变量结构(
var qfq_pf=...),用ast.literal_eval解析(不执行 JS) - 返回
[{date, factor}]数组,日期格式YYYY-MM-DD - 消费方:
sina_source.py::get_sina_adjust_factor(),被fox_kline_daily融合器读取
北交所 K 线 / ETF 兜底 K 线
https://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData/getKLineData
?symbol={symbol}&scale=240&datalen=1023
scale=240即日线,datalen控制返回根数(最大约 2000)- 返回不复权 OHLCV 数组
- 消费方:
sina_source.py::get_daily_kline()- 北交所 K 线主源(腾讯 fqkline 不覆盖
bj前缀代码) - ETF 历史 K 线兜底(腾讯 fqkline 为 ETF 主源,失败时回落新浪)
- 北交所 K 线主源(腾讯 fqkline 不覆盖
跨市场数据(A50 期货 + 离岸人民币)
https://hq.sinajs.cn/list=hf_A50,USDCNH # 实时行情
- 返回格式:
var hq_str_hf_A50="..."纯文本,字段以逗号分隔 - 唯一源:腾讯全球目录没有 SGX A50 期货与离岸人民币(实测期货 50 行无 A50、外汇 36 行只有在岸 USDCNY)
- 消费方:
cross_market_data.py::sina_cross_market_quotes(),被ext_market_sync16:40 调用 - 落库:
sina_cross_market_daily(trade_date源侧自报,不归一 A 股交易日历——24h 品种周五夜盘收盘常在北京周六凌晨)
国内期货主力合约
https://hq.sinajs.cn/list=nf_AU0,nf_AG0,... # 期货主力(nf_ 前缀)
- 支持多品种并行拉取(
_fetch_sina_futures_multi()),覆盖贵金属/有色/黑色/化工/农产品/股指期货 - 消费方:
futures_sources.py,被ext_market_sync16:40 调用
资金流备用源
https://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/
MoneyFlow.ssl_qsfx_zjlrqs?page=1&num=5&sort=opendate&asc=0&daima=sh600519
- 返回格式:JSON 数组(可能带非 JSON 包裹文本,实现按首个
[到末个]截取后再json.loads) - 字段:
netamount(净买入额,万元)、opendate(日期) - 注意:该接口是单股口径,未传
code时实现内部默认取600519,只作市场级"资金概况"的量级估算
大盘指数 / 市场概览
https://hq.sinajs.cn/list=s_sh000001,s_sz399001,... # 大盘指数实时
https://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getQianLongData?index=sh000001&type=minute # 分时
- 指数实时行情(
s_前缀为简版,含当前价/涨跌额/涨跌幅/成交量/成交额) - 消费方:
sina_source.py::get_index_daily()/get_market_spot()(腾讯指数主源不可用时降级)
行业涨跌幅
https://vip.stock.finance.sina.com.cn/quotes_service/api/json_v2.php/Market_Center.getHQNodeDataSimple?page=1&num=80&sort=changepercent&asc=0&node=new_sina_hy
- 返回全行业涨跌排序(
newSinaHy.php行业分类) - 消费方:
sina_source.py::get_industry_boards()(腾讯 getRank 主源不可用时降级)
美元指数兜底
https://hq.sinajs.cn/list=DINIW # 美元指数实时
- 消费方:
macro_sources.py::_dxy_from_sina()(东财RPT_ECONOMY_EXRATE不可用时降级)
定时任务调用链
| 定时任务 | 时间 | 调用的新浪函数 | 落库表 |
|---|---|---|---|
fin_statement_sync | 20:30 | download_sina_statements_all() | sina_financial_statement(RAW) |
fox_daily_sync → finance_indicator 阶段 | 16:00 | sina_financial_report()(单股兜底) | sina_financial_indicator(STG) |
ext_market_sync | 16:40 | sina_cross_market_quotes() + _fetch_sina_futures_multi() | sina_cross_market_daily |
fox_kline_sync → 北交所分支 | 15:40 | get_daily_kline()(bj 前缀) | fox_kline_daily |
fox_wide_sync → 复权因子 | 16:20 | get_sina_adjust_factor() | 内存传递(不落库) |
触发条件(资金流降级)
东财熔断器 OPEN、抛 RateLimitError(403/429)或可降级的 DataSourceError 三条路径下,均会尝试新浪备用源,且受重试预算 budget.consume() 约束(fetchers.py):
except RateLimitError as e:
em_breaker.record_failure()
if data_type == "fund_flow" and budget.consume():
sina_result = await sina_fund_flow()
if sina_result:
result = build_fund_flow(sina_result)
source_used = "sina_backup"
返回数据示例
资金流(兜底)
{
"total_volume": 123.4, # 成交额(亿,由净额绝对值折算)
"main_net_inflow": -5.67, # 主力净流入(亿)
"limit_up_success_rate": 0, # 新浪无此数据
"_source": "sina_backup", # 标记数据来源
}
复权因子
[
{"date": "2020-01-02", "factor": 1.0},
{"date": "2020-06-15", "factor": 0.95}, # 除权日
...
]
跨市场(A50 / CNH)
{
"A50": {"price": 12345.6, "change_pct": 0.5, "trade_date": "2026-09-28"},
"USDCNH": {"price": 7.2345, "change_pct": -0.1, "trade_date": "2026-09-28"},
}
在降级链中的位置
| 数据类型 | 主源 | 新浪角色 | 触发条件 |
|---|---|---|---|
| 财报三表 / gjzb | 新浪 + TDX | 主源 | 始终使用 |
| 复权因子 | 新浪 | 主源 | 始终使用 |
| 北交所 K 线 | 新浪 | 主源 | 腾讯不覆盖 bj 前缀 |
| A50 / CNH | 新浪 | 唯一源 | 腾讯无此品种 |
| 国内期货 | 新浪 | 主源 | 始终使用 |
| ETF K 线 | 腾讯 fqkline | 兜底 | 腾讯失败 |
| 资金流 | TDX → 东财 | 兜底 | 东财熔断/限流 |
| 大盘指数 | 腾讯 | 降级 | 腾讯失败 |
| 行业排名 | 腾讯 getRank | 降级 | 腾讯失败 |
| 美元指数 | 东财 | 兜底 | 东财不可用 |
批量下载策略
gjzb 关键指标(sina_batch.py)
- 并发控制:4 并发 + 0.3s 节流(实测 5500 只约 8 分钟)
- 分块熔断:每 100 只检查失败率,>30% 整批中止并记
partial - 无数据前缀守卫:新浪对无数据标的返回固定前缀
var quote=...(空体),解析时跳过而非计入失败(2026-09 修复,避免死锁) - 落库:
sina_financial_indicator(STG),按优先级裁定(新浪主源可刷新/夺取,东财回填备源只补空缺)
财报三表(sina_stmt_batch.py)
- 轮换策略:1200 只/轮,按「最久未更新优先」排序
- 窗口:每次拉取最近 4 个报告期(
num=4) - 落库:
sina_financial_statement(RAW),由fin_statement_sync20:30 调用 - 非交易日也执行:财报披露不受交易日历限制
注意事项
提示
- 风控最宽松:新浪是降级链中最可靠的兜底层,但统一 HTTP 客户端与重试策略仍然生效,不做高频逐股循环
- 北交所代码前缀:
bj(920/8/4开头,920判断须先于9),腾讯 fqkline 不覆盖,新浪是主源 - 复权因子不执行 JS:
qfq.js/hfq.js是纯文本变量声明,用ast.literal_eval解析(不引入 JS 引擎) - 资金流精度低:仅单股级别、无涨跌停统计,只用于降级兜底,不替代 TDX/东财
- 跨市场 trade_date 不归一:A50 期货 24h 交易,周五夜盘收盘常在北京周六凌晨,
trade_date源侧自报(不归一 A 股交易日历),否则两头错 - 财报批量无数据前缀:新浪对无数据标的返回固定空体(
var quote=...),解析时必须跳过而非计入失败率(否则触发分块熔断) - gjzb 优先级裁定:
sina_financial_indicator多源混写时按_FIN_IND_RANK裁定(新浪主源可刷新/夺取,东财备源只补空缺),值与source标签必须同一次提交内更新