选内置 YFData
研究美股 / ETF / 加密,且当前网络能直连 Yahoo Finance 时更省事:一条命令就得到 DataFrame,适合复现官方示例。前提是网络可达,并且能接受数据源方随时调整字段与可用区间;长期研究仍建议把数据快照落到本地。
Data
回测输入本质上是按时间索引组织的 pandas Series/DataFrame。内置 YFData 示例连接 Yahoo Finance,境内访问可能受限;A 股可由 AKShare/Tushare 等取得后转为 DataFrame,但复权、交易日、停牌与涨跌停处理需自行核验。本页是数据适配清单,不宣称所有接口已在本站环境实测。
下表按「取数方式 / 覆盖范围 / 适用场景 / 限制」整理 vectorbt 常见数据来源;字段名、是否收费与是否需要 Token,以各数据源官方文档为准。
| 数据源 | 取数方式 | 覆盖范围 | 适用场景 | 限制与注意点 |
|---|---|---|---|---|
| YFData(内置) | vbt.YFData.download("BTC-USD") | Yahoo Finance 覆盖的股票 / ETF / 加密等 | 海外标的、复现官方示例、快速起手 | 中国大陆访问可能受限或限流;可用标的与字段以数据源为准 |
| akshare | ak.stock_zh_a_hist(...) 等接口取数后整理成 DataFrame | A 股、期货、基金、指数、宏观等公开数据 | 不想申请 Token 的国内公开数据 | 接口名与返回列随版本变化;数据来自公开财经网站,需自行校验 |
| tushare | pro.daily(...) 等接口 | A 股 / 港股 / 美股 / 基金 / 期货 / 债券 + 宏观 | 需要较全维度与稳定字段的研究 | 需注册 Token;积分与频次限制以官方为准 |
| 本地 CSV / Parquet | pandas.read_csv / read_parquet | 任意市场(只要能拿到数据) | 结果要可复现、离线研究、内部数据 | 字段、复权口径与时间范围需自己保证 |
| 机构 / 券商导出文件 | 导出后整理成 DataFrame | 你所在机构有权限的市场与品种 | 有合规数据源、要精细控制样本 | 字段口径因机构而异;使用与分发需符合数据授权 |
| 合成数据 | pandas / NumPy 生成(如随机游走) | 不依赖任何外部市场 | 验证代码路径、教学示例、跑通流程 | 不能用于任何绩效结论,统计特征与真实市场不同 |
| 多标的拼接 | 多个 DataFrame 按日期 join | 指数成分、行业组合、自定义股票池 | 组合与横截面研究 | 内连接会缩短样本,外连接会引入 NaN,需明确取舍 |
以一只 A 股的日线为例,走完 vectorbt 的「取数 → 转时间索引 → 质量检查 → 多标的对齐 → 交给组合」五步。每步给出代码、说明与预期结果;接口名与参数取值以对应数据源官方文档为准。
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 指定,可用取值以该数据源文档为准。
预期:打印出末尾若干行「日期 + 开高低收 + 成交量」的表格,行数约等于区间内交易日数。若这一步就报错或返回空表,先查标的存在性、区间是否有效与网络是否可达。
pythonimport pandas as pd
df["日期"] = pd.to_datetime(df["日期"])
df = df.set_index("日期").sort_index()
close = df["收盘"].astype(float)
指标与组合都按索引对齐,所以取数后必须先把日期列变成 DatetimeIndex 并排序;取一列收盘价就是一维价格序列。
预期:close.index 单调递增且无重复,长度等于交易日数。若索引乱序,后面生成的信号会与价格错位。
pythonprint(close.isna().sum())
print(close.index.is_monotonic_increasing)
print(close.index.duplicated().sum())
三项一次看完:缺失值数量、索引是否单调、是否有重复日期。数据质量决定回测可信度,脏数据不要带进下一步。
预期:输出类似 0 / True / 0。任何一项不符,先按下文「数据质量自检清单」处理,再继续。
pythonprices = pd.concat([close, close_2], axis=1, join="inner").dropna()
print(prices.shape)
组合回测要求所有标的共用一条时间轴。join="inner" 取共同交易日,样本偏短但不会有空档;外连接则保留全部日期并产生 NaN,需自行决定填充规则。
预期:得到一个「日期 × 标的」的二维表且无 NaN,行数为共同交易日数(通常少于单标的区间)。
pythonimport vectorbt as vbt
pf = vbt.Portfolio.from_holding(prices)
pf.stats()
先用「买入并持有」把数据链路跑通,确认能出结果,再换成信号驱动的组合(见 Portfolio 与指标信号两页)。
预期:每个标的一列统计结果,含区间、总收益、回撤等字段。字段名与计算口径以官方实现为准,不同版本可能增减。
回测框架不会自动替用户决定复权、停牌和涨跌停成交规则。下表是接入审计清单;具体字段和规则须按所用数据源及市场规则复核,本页不表示所有接口已在本站运行验证。
| 现象 | 成因 | 处理方式 | 注意点 |
|---|---|---|---|
| 停牌与缺失值 | 停牌日缺行或行情缺字段 | 先匹配交易状态;明示填充/剔除,不把停牌默认为可成交 | 填充会引入价格与交易假设,保留标记便于审计 |
| 价格复权口径 | 除权除息日出现跳空,或因子随时间变化 | 统一前复权/后复权/不复权字段并留采集时间 | 不同口径适用于不同问题,不能混合计算信号与收益 |
| 涨跌停成交 | 信号出现但当日封板 | 单独使用涨跌停状态数据并制定拒单/延后规则 | OHLCV 本身不表示排队成交与实际可成交性 |
| 最小交易单位 | 订单数量为小数或低于最小手数 | 按市场规则取整并重新核算资金 | 数量取整会改变实际仓位,需记录舍弃金额 |
| 交易日历和时区 | 节假日、港股与 A 股日期对不齐 | 按市场交易日历构建索引,统一时间戳约定 | 自然日补齐可能产生非交易日伪信号 |
| 多标的上市区间 | 资产上市/退市日期不同 | 按当时可用样本定义股票池并对齐日期 | 只用当前存续成分回看会产生幸存者偏差 |
| 成交量/金额单位 | 数量级异常或不同数据源数值不一致 | 核实股/手、元/千元等单位后再输入 | 单位错误会污染仓位、成本和流动性过滤 |
| 数据源版本变化 | 接口字段名或返回格式改变 | 记录数据包版本、接口、测试日期和字段映射 | 不要将某次响应结构当作永久契约 |
分红与送转会让 vectorbt 读到的价格出现跳空,复权口径决定了收益率是否连续。下表的算法与字段名以数据源官方文档为准,不同数据源对「前复权 / 后复权」的实现细节可能不同。
| 口径 / 概念 | 含义 | 对回测的影响 | 什么时候用 |
|---|---|---|---|
| 不复权 | 交易所原始成交价 | 除权除息日出现向下跳空,收益率被低估 | 核对真实成交价、标注原始价格时 |
| 前复权 | 以当前价格为基准向前调整历史价 | 历史价格会随最新除权变化,同一策略在不同时间取数结果不同 | 看近期形态与图形分析 |
| 后复权 | 以上市初价格为基准向后累计调整 | 历史值固定、收益率连续,适合计算累计收益 | 回测计算收益率(常用口径) |
| 复权因子 | 数据源给出的调整比例 | 用因子可在不同口径间换算,便于跨数据源统一 | 需要跨源比对、或自行实现复权时 |
| 指数 / ETF | 按点位或净值口径发布 | 不存在个股式分红复权,但成分与份额会调整 | 作为策略基准做对比时 |
| 分红再投资假设 | 现金分红是否按当日价格再买入 | 直接影响长期累计收益的高低 | 长期持有类策略,需在报告中写明假设 |
| 复权导致极端值 | 极端除权或数据错误可能出现 0 或负价 | 会让收益率出现无穷大或 NaN,污染绩效统计 | 回测前必须质检,异常日期单独处理 |
vectorbt 的数据源选择标准不是「哪个数据全」,而是「你的研究目标 + 当前网络与账号条件」是否匹配;三张卡各给一条路径与它的前提。
研究美股 / ETF / 加密,且当前网络能直连 Yahoo Finance 时更省事:一条命令就得到 DataFrame,适合复现官方示例。前提是网络可达,并且能接受数据源方随时调整字段与可用区间;长期研究仍建议把数据快照落到本地。
做 A 股 / 期货 / 基金研究且不想申请 Token 时,这条路覆盖公开数据面较广、上手快,返回的就是 DataFrame。代价是接口与返回列会随版本变化,需要自己校验字段与口径,并留意取数频次。
需要财务、宏观、港美股等多维度数据,且已有 Token 时,接口体系更完整,适合成规模的研究。代价是 Token 与积分频次限制,价格与授权范围以官方为准;商用分发前需确认服务条款。
下面八项建议在每次 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() | 与代码约定一致 | 统一重命名,避免策略代码绑定某个数据源 |
| 时间范围覆盖回测区间 | 比较数据首末日期与回测起止日期 | 数据起始日不晚于回测起点,结束日不早于回测终点 | 补拉数据,或缩短回测区间并说明 |
| 成交量与成交额量级 | 与相邻交易日对比量级 | 无突然归零或数量级异常 | 核对数据源与单位口径(手 / 股),必要时换源交叉验证 |
常见原因是当前网络无法直连或触发限流,具体可用性与限频规则以数据源官方说明为准。可行做法:先改成本地 CSV / Parquet,或用 akshare、tushare 取数后自行整理成 DataFrame,见上方数据源对照表。这一步与策略本身无关,属于数据可达性问题。
akshare 不需要 Token、上手快,适合取公开数据做快速研究;tushare 需要注册 Token,接口体系更成体系,适合财务、宏观、港美股等多维度需求。两者的接口名、返回字段与频次限制都以其官方文档为准。建议先用小样本各跑一次,按你实际的字段完整性需求决定。
指标、信号与组合的输入基本都要求 pandas DataFrame / Series,因此「日期索引 + 数值列」是更稳妥的形态。任何数据源只要能整理成这个形态就能接入;如果拿到的是长表(含代码列),先按标的透视成宽表再对齐;输入形态要求以官方文档为准
回测计算收益率通常用后复权(历史值固定、收益连续),避免分红送转造成的跳空;需要展示真实成交价时再单列不复权价。同一份研究只用一个口径,并在报告中写明。具体复权实现与字段名以数据源官方文档为准。
可以用合成数据(如随机游走)验证代码路径与信号逻辑是否写得对,这在小样本下很快。但它不能用于任何绩效结论——真实市场的波动聚集与跳空特征与合成序列不同。要出结论必须换成真实数据,并记录数据源与采集日期;合成数据用法以官方文档为准
常见处理:放慢取数节奏、分批拉取、把结果落到本地快照后只读本地文件;必要时换数据源并交叉验证字段。各数据源的限频与配额规则以官方为准,不建议用多账号轮询之类绕过限制的做法,账号与合规风险要自己承担。
这个项目定位是回测与策略研究,不含券商下单通道,数据接口也以研究用为主。实盘需要自行对接交易接口并处理委托、风控与对账,涉及真实资金,风险与合规责任由使用者承担;研究结论不能直接当作实盘依据;项目定位以官方 README 为准
本机已核验的技能里有 akshare-finance(财经数据接口)与 tushare-finance(Tushare Pro 接口)等方向,可以用对话方式取数与做基础分析,免去自己写取数脚本。但 vectorbt 与本机技能路线无已证实集成,两条路线相互独立:拿到的数据仍需你自己做字段与口径校验,再决定是否接入回测流程。相关技能的能力边界以其技能说明与官方文档为准。