Data

vectorbt A 股数据接入:AKShare/Tushare 字段、复权与停牌处理

回测输入本质上是按时间索引组织的 pandas Series/DataFrame。内置 YFData 示例连接 Yahoo Finance,境内访问可能受限;A 股可由 AKShare/Tushare 等取得后转为 DataFrame,但复权、交易日、停牌与涨跌停处理需自行核验。本页是数据适配清单,不宣称所有接口已在本站环境实测。

内置:vbt.YFData国内源:akshare / tushare输入:pandas DataFrame
取数(YFData / 国内源)
转 DataFrame(日期索引)
清洗与对齐
喂给指标与组合
数据接入的四个环节示意(schematic);YFData 在中国大陆可能受限,可改用国内源或本地文件。
Sources

vectorbt 数据源对照:几种取数方式怎么选

下表按「取数方式 / 覆盖范围 / 适用场景 / 限制」整理 vectorbt 常见数据来源;字段名、是否收费与是否需要 Token,以各数据源官方文档为准。

数据源取数方式覆盖范围适用场景限制与注意点
YFData(内置)vbt.YFData.download("BTC-USD")Yahoo Finance 覆盖的股票 / ETF / 加密等海外标的、复现官方示例、快速起手中国大陆访问可能受限或限流;可用标的与字段以数据源为准
akshareak.stock_zh_a_hist(...) 等接口取数后整理成 DataFrameA 股、期货、基金、指数、宏观等公开数据不想申请 Token 的国内公开数据接口名与返回列随版本变化;数据来自公开财经网站,需自行校验
tusharepro.daily(...) 等接口A 股 / 港股 / 美股 / 基金 / 期货 / 债券 + 宏观需要较全维度与稳定字段的研究需注册 Token;积分与频次限制以官方为准
本地 CSV / Parquetpandas.read_csv / read_parquet任意市场(只要能拿到数据)结果要可复现、离线研究、内部数据字段、复权口径与时间范围需自己保证
机构 / 券商导出文件导出后整理成 DataFrame你所在机构有权限的市场与品种有合规数据源、要精细控制样本字段口径因机构而异;使用与分发需符合数据授权
合成数据pandas / NumPy 生成(如随机游走)不依赖任何外部市场验证代码路径、教学示例、跑通流程不能用于任何绩效结论,统计特征与真实市场不同
多标的拼接多个 DataFrame 按日期 join指数成分、行业组合、自定义股票池组合与横截面研究内连接会缩短样本,外连接会引入 NaN,需明确取舍
口径提醒:本页只讲与回测相关的数据准备动作。各数据源的可用区间、复权字段、限频规则与授权范围都会变化,请以对应官方文档为准;数据是否允许商用需自行确认。所有回测结果仅供研究,不构成投资建议。
Steps

vectorbt 怎么把 A 股数据接进回测?五步实操

以一只 A 股的日线为例,走完 vectorbt 的「取数 → 转时间索引 → 质量检查 → 多标的对齐 → 交给组合」五步。每步给出代码、说明与预期结果;接口名与参数取值以对应数据源官方文档为准。

  1. 取到一段日线

    pythonimport akshare as ak
    
    df = ak.stock_zh_a_hist(
        symbol="600519", period="daily",
        start_date="20240101", end_date="20241231", adjust="hfq",
    )
    print(df.tail())

    先确认能拿到数据,再谈后面的整理。复权口径由 adjust 指定,可用取值以该数据源文档为准。

    预期:打印出末尾若干行「日期 + 开高低收 + 成交量」的表格,行数约等于区间内交易日数。若这一步就报错或返回空表,先查标的存在性、区间是否有效与网络是否可达。

  2. 转成时间索引的一维价格序列

    pythonimport pandas as pd
    
    df["日期"] = pd.to_datetime(df["日期"])
    df = df.set_index("日期").sort_index()
    close = df["收盘"].astype(float)

    指标与组合都按索引对齐,所以取数后必须先把日期列变成 DatetimeIndex 并排序;取一列收盘价就是一维价格序列。

    预期:close.index 单调递增且无重复,长度等于交易日数。若索引乱序,后面生成的信号会与价格错位。

  3. 先做一次数据质检

    pythonprint(close.isna().sum())
    print(close.index.is_monotonic_increasing)
    print(close.index.duplicated().sum())

    三项一次看完:缺失值数量、索引是否单调、是否有重复日期。数据质量决定回测可信度,脏数据不要带进下一步。

    预期:输出类似 0 / True / 0。任何一项不符,先按下文「数据质量自检清单」处理,再继续。

  4. 多标的对齐到同一条时间轴

    pythonprices = pd.concat([close, close_2], axis=1, join="inner").dropna()
    print(prices.shape)

    组合回测要求所有标的共用一条时间轴。join="inner" 取共同交易日,样本偏短但不会有空档;外连接则保留全部日期并产生 NaN,需自行决定填充规则。

    预期:得到一个「日期 × 标的」的二维表且无 NaN,行数为共同交易日数(通常少于单标的区间)。

  5. 交给指标与组合验证

    pythonimport vectorbt as vbt
    
    pf = vbt.Portfolio.from_holding(prices)
    pf.stats()

    先用「买入并持有」把数据链路跑通,确认能出结果,再换成信号驱动的组合(见 Portfolio 与指标信号两页)。

    预期:每个标的一列统计结果,含区间、总收益、回撤等字段。字段名与计算口径以官方实现为准,不同版本可能增减。

落地建议:把整理好的数据存成 CSV / Parquet,并在文件名或字段里记录采集日期与复权口径。这样回测结果可复现,也便于日后核对数据源是否改了字段。
Pitfall

vectorbt A 股数据接入前应审计哪些交易规则?

回测框架不会自动替用户决定复权、停牌和涨跌停成交规则。下表是接入审计清单;具体字段和规则须按所用数据源及市场规则复核,本页不表示所有接口已在本站运行验证。

现象成因处理方式注意点
停牌与缺失值停牌日缺行或行情缺字段先匹配交易状态;明示填充/剔除,不把停牌默认为可成交填充会引入价格与交易假设,保留标记便于审计
价格复权口径除权除息日出现跳空,或因子随时间变化统一前复权/后复权/不复权字段并留采集时间不同口径适用于不同问题,不能混合计算信号与收益
涨跌停成交信号出现但当日封板单独使用涨跌停状态数据并制定拒单/延后规则OHLCV 本身不表示排队成交与实际可成交性
最小交易单位订单数量为小数或低于最小手数按市场规则取整并重新核算资金数量取整会改变实际仓位,需记录舍弃金额
交易日历和时区节假日、港股与 A 股日期对不齐按市场交易日历构建索引,统一时间戳约定自然日补齐可能产生非交易日伪信号
多标的上市区间资产上市/退市日期不同按当时可用样本定义股票池并对齐日期只用当前存续成分回看会产生幸存者偏差
成交量/金额单位数量级异常或不同数据源数值不一致核实股/手、元/千元等单位后再输入单位错误会污染仓位、成本和流动性过滤
数据源版本变化接口字段名或返回格式改变记录数据包版本、接口、测试日期和字段映射不要将某次响应结构当作永久契约
原则:填充与剔除都是在「改变数据」,必须在研究报告里写明规则;同时保留一份原始数据备查,否则日后无法判断结果差异来自策略还是清洗动作。
Adjust

vectorbt 复权口径说明:六种情况怎么用

分红与送转会让 vectorbt 读到的价格出现跳空,复权口径决定了收益率是否连续。下表的算法与字段名以数据源官方文档为准,不同数据源对「前复权 / 后复权」的实现细节可能不同。

口径 / 概念含义对回测的影响什么时候用
不复权交易所原始成交价除权除息日出现向下跳空,收益率被低估核对真实成交价、标注原始价格时
前复权以当前价格为基准向前调整历史价历史价格会随最新除权变化,同一策略在不同时间取数结果不同看近期形态与图形分析
后复权以上市初价格为基准向后累计调整历史值固定、收益率连续,适合计算累计收益回测计算收益率(常用口径)
复权因子数据源给出的调整比例用因子可在不同口径间换算,便于跨数据源统一需要跨源比对、或自行实现复权时
指数 / ETF按点位或净值口径发布不存在个股式分红复权,但成分与份额会调整作为策略基准做对比时
分红再投资假设现金分红是否按当日价格再买入直接影响长期累计收益的高低长期持有类策略,需在报告中写明假设
复权导致极端值极端除权或数据错误可能出现 0 或负价会让收益率出现无穷大或 NaN,污染绩效统计回测前必须质检,异常日期单独处理
实操建议:同一份研究里只用一个复权口径,并在报告首页写明口径、数据源与采集日期。需要展示真实价格时,单列一列不复权价,不要与回测输入混用。
Decision

vectorbt 数据源怎么选

vectorbt 的数据源选择标准不是「哪个数据全」,而是「你的研究目标 + 当前网络与账号条件」是否匹配;三张卡各给一条路径与它的前提。

选内置 YFData

研究美股 / ETF / 加密,且当前网络能直连 Yahoo Finance 时更省事:一条命令就得到 DataFrame,适合复现官方示例。前提是网络可达,并且能接受数据源方随时调整字段与可用区间;长期研究仍建议把数据快照落到本地。

选 akshare

做 A 股 / 期货 / 基金研究且不想申请 Token 时,这条路覆盖公开数据面较广、上手快,返回的就是 DataFrame。代价是接口与返回列会随版本变化,需要自己校验字段与口径,并留意取数频次。

选 tushare

需要财务、宏观、港美股等多维度数据,且已有 Token 时,接口体系更完整,适合成规模的研究。代价是 Token 与积分频次限制,价格与授权范围以官方为准;商用分发前需确认服务条款。

Checklist

vectorbt 回测前要做哪些数据质量自检?

下面八项建议在每次 vectorbt 回测前执行一次,几分钟就能挡掉大部分「结果看起来不对」的问题。命令示例基于 pandas,具体 API 以 pandas 官方文档为准。

检查项怎么查预期结果不合格怎么处理
索引单调递增prices.index.is_monotonic_increasing输出 True先 sort_index(),再重查一遍
重复日期prices.index.duplicated().sum()输出 0去重后重新排序,并回查数据源是否重复拉取
交易日缺失看相邻日期间隔 prices.index.to_series().diff().dt.days 的变化间隔符合市场交易日历(长假除外)对照交易日历补齐,或明确标记为停牌区间
价格是否为 0 或负(prices <= 0).sum()各项为 0定位异常日期回源核对,或剔除该标的该段
缺失值比例prices.isna().mean()接近 0;停牌标的应有明确处理规则按统一填充规则处理,或整段剔除并记录
列名与大小写一致prices.columns.tolist()与代码约定一致统一重命名,避免策略代码绑定某个数据源
时间范围覆盖回测区间比较数据首末日期与回测起止日期数据起始日不晚于回测起点,结束日不早于回测终点补拉数据,或缩短回测区间并说明
成交量与成交额量级与相邻交易日对比量级无突然归零或数量级异常核对数据源与单位口径(手 / 股),必要时换源交叉验证
记录要求:自检结果与清洗规则建议随研究笔记一起留档。数据一旦变更(换源、改复权、补数据),历史回测结论都应当重新跑一遍再比较。
FAQ

vectorbt 常见问题

为什么 YFData 下载失败?

常见原因是当前网络无法直连或触发限流,具体可用性与限频规则以数据源官方说明为准。可行做法:先改成本地 CSV / Parquet,或用 akshare、tushare 取数后自行整理成 DataFrame,见上方数据源对照表。这一步与策略本身无关,属于数据可达性问题。

akshare 和 tushare 怎么选?

akshare 不需要 Token、上手快,适合取公开数据做快速研究;tushare 需要注册 Token,接口体系更成体系,适合财务、宏观、港美股等多维度需求。两者的接口名、返回字段与频次限制都以其官方文档为准。建议先用小样本各跑一次,按你实际的字段完整性需求决定。

数据一定要转成 DataFrame 吗?

指标、信号与组合的输入基本都要求 pandas DataFrame / Series,因此「日期索引 + 数值列」是更稳妥的形态。任何数据源只要能整理成这个形态就能接入;如果拿到的是长表(含代码列),先按标的透视成宽表再对齐;输入形态要求以官方文档为准

复权价和原始价用哪个?

回测计算收益率通常用后复权(历史值固定、收益连续),避免分红送转造成的跳空;需要展示真实成交价时再单列不复权价。同一份研究只用一个口径,并在报告中写明。具体复权实现与字段名以数据源官方文档为准。

没有行情数据能先跑通回测吗?

可以用合成数据(如随机游走)验证代码路径与信号逻辑是否写得对,这在小样本下很快。但它不能用于任何绩效结论——真实市场的波动聚集与跳空特征与合成序列不同。要出结论必须换成真实数据,并记录数据源与采集日期;合成数据用法以官方文档为准

数据源限流或临时取不到数据怎么办?

常见处理:放慢取数节奏、分批拉取、把结果落到本地快照后只读本地文件;必要时换数据源并交叉验证字段。各数据源的限频与配额规则以官方为准,不建议用多账号轮询之类绕过限制的做法,账号与合规风险要自己承担。

能直接用券商行情做实盘吗?

这个项目定位是回测与策略研究,不含券商下单通道,数据接口也以研究用为主。实盘需要自行对接交易接口并处理委托、风控与对账,涉及真实资金,风险与合规责任由使用者承担;研究结论不能直接当作实盘依据;项目定位以官方 README 为准

数据准备这块能交给本机技能路线吗?

本机已核验的技能里有 akshare-finance(财经数据接口)与 tushare-finance(Tushare Pro 接口)等方向,可以用对话方式取数与做基础分析,免去自己写取数脚本。但 vectorbt 与本机技能路线无已证实集成,两条路线相互独立:拿到的数据仍需你自己做字段与口径校验,再决定是否接入回测流程。相关技能的能力边界以其技能说明与官方文档为准。

数据接好了,看路线对比

下一步对比自建向量化回测与本机量化技能两条路线,决定走哪条。