内置指标
均线、布林带、RSI、MACD 等常用指标以访问器形式挂载,调用后得到带属性的结果对象(如均线对象的均线序列),可直接参与后续布尔运算与回测。具体支持清单与参数命名以官方 API 文档为准,不同版本可能增补。
Indicators & Signals
策略研究真正卡人的环节不是写策略,而是把行情稳定地转成可回测的买卖信号。这套框架用 vbt.MA.run 这类访问器算指标,用 crossed_above / crossed_below 判断序列交叉,再交给 Portfolio.from_signals 回测。本页以双均线为例,把「指标 → 信号 → 回测」这条链路拆成可逐步验证的步骤,并说明指标与参数该怎么选。
vectorbt 的双均线五步按顺序做,每步都给真实代码、一句话说明和可验证的预期结果;命令与参数取值以官方文档和实际解释器提示为准。
指标和信号都挂在 pandas 对象上,所以首先要拿到一列收盘价。用内置数据访问器可以直接下载,也可以换成自备 CSV(见数据接入页)。
import vectorbt as vbt
price = vbt.YFData.download('AAPL', start='2023-01-01').get('Close')
print(price.tail())
预期:打印出末尾若干行「日期 → 收盘价」。若这一步就报网络类错误,说明数据源在当前网络不可达,先换成本地 CSV 或国内数据源再继续;能否下载到数据与数据源可用性有关,与指标逻辑无关。
同一套访问器可以对同一条价格序列跑多次,得到不同窗口的均线;两条均线的差与交叉,就是双均线策略的全部信息。
fast = vbt.MA.run(price, 10).ma
slow = vbt.MA.run(price, 30).ma
预期:得到两条与价格等长的序列,窗口越大,开头缺失值越多(10 日均线前 9 根为空,30 日均线前 29 根为空)。缺失值不参与后续布尔判断,这是后面要留意的地方。
交叉判断返回布尔序列:上穿为 True 的位置当作买入信号,下穿为 True 的位置当作卖出信号。先数一下 True 的个数,可以快速判断信号频率是否合理。
entries = fast.vbt.crossed_above(slow)
exits = fast.vbt.crossed_below(slow)
print(entries.sum(), exits.sum())
预期:两个整数,通常远小于 bar 总数——若一年内信号上百次,说明窗口太小或标的噪声太大,实盘会被手续费吃掉,建议回到本页参数表重新选窗口。
当天收盘才能算出当天的均线,如果直接用当天信号在当天成交,等于用收盘价"预知"了信号。把信号整体后移一根 bar,才符合「收盘后决策、下一根 bar 执行」的实际情况。
entries = entries.shift(1).astype(bool)
exits = exits.shift(1).astype(bool)
预期:信号位置整体后移一格。注意 shift 会产生缺失值,必须转成布尔类型再回测,否则会出现类型或缺失值相关的报错。
把价格、买入信号、卖出信号一起交给组合回测入口,就能得到净值、回撤与各项绩效统计;需要手续费和滑点时可以继续加参数(取值以官方 API 文档为准)。
pf = vbt.Portfolio.from_signals(price, entries, exits, fees=0.001)
print(pf.stats())
预期:返回一个组合对象,并打印出「指标名 → 取值」的统计表。字段名称与计算口径以官方实现输出为准,不同版本可能增加或调整字段;回测结果只反映历史区间表现,不构成投资建议。
下表按 vectorbt 里「先有指标、再有信号」的顺序整理,关键参数一列写的是常见起点而不是固定默认值——各项指标的默认窗口与实现细节以官方 API 文档为准。
| 指标 / 工具 | 作用 | 关键参数 | 适用场景 | 注意点 |
|---|---|---|---|---|
移动均线 MA(vbt.MA.run) | 平滑价格,刻画趋势方向 | 窗口长度(如 10 / 30) | 趋势跟随、双均线交叉 | 滞后指标,窗口越大转折越迟;震荡行情里交叉频繁失效 |
布林带 BBANDS(vbt.BBANDS.run) | 用波动带宽给出价格相对位置 | 窗口长度与带宽倍数 | 超买超卖、波动收缩与突破 | 带宽随波动放大,区间震荡与单边行情下的解读完全不同 |
RSI(vbt.RSI.run) | 把涨幅与跌幅折算成 0–100 的动量值 | 周期长度、超买超卖阈值 | 震荡区间反转、动量强弱判断 | 强势单边行情里会长时间停留在超买或超卖区,别当反向信号硬用 |
MACD(vbt.MACD.run) | 用快慢均线差与信号线判断动量转折 | 快线、慢线、信号线周期 | 趋势转折确认、动量背离观察 | 本质仍是均线组合,噪声放大时金叉死叉同样会密集出现 |
交叉判断(crossed_above / crossed_below) | 判断一条序列是否上穿或下穿另一条 | 无(两条序列即可) | 均线交叉、指标与阈值线交叉 | 返回布尔序列,缺失值位置恒为 False,需自行确认是否合理 |
自定义指标(vbt.Indicator 子类化) | 把自有算法接进同一套向量化流程 | 自定 | 研报因子、特殊规则指标 | 继承内置指标基类或先用 pandas/NumPy 算好,两种做法得到的都是可回测序列 |
| 第三方指标(TA-Lib / Pandas TA,经可选集成扩展) | 直接调用成熟技术指标库 | 随第三方库定义 | 需要大量现成指标、避免重复造轮子 | 属于可选集成扩展,安装时最常卡在底层 C 库;这些库的许可以其各自仓库为准 |
| 信号频率统计 | 评估信号是否可用 | 统计口径自定 | 参数筛选前的一道体检 | 信号过多意味着成本吞噬,过少意味着样本不足,两者都不能直接进入参数寻优 |
vectorbt 的指标只是研究链路的一环,能不能把指标、绩效与图表串起来,才决定这套流程是否值得长期用。
均线、布林带、RSI、MACD 等常用指标以访问器形式挂载,调用后得到带属性的结果对象(如均线对象的均线序列),可直接参与后续布尔运算与回测。具体支持清单与参数命名以官方 API 文档为准,不同版本可能增补。
研报里的非标准因子往往没有现成实现,这时可以继承内置指标基类自定义,或先用 pandas / NumPy 手工算好再接入信号流程。两种方式产出的都是与价格等长的序列,后续步骤完全一致,迁移成本很低。
需要成规模的成熟指标时,可以通过可选集成扩展接入 TA-Lib、Pandas TA 等技术指标库。这一步依赖底层 C 库与平台编译环境,是安装失败最集中的环节;装不上时可以退回内置指标继续研究,功能不受阻断。
组合回测的结果可以接绩效分析类库输出统计摘要与报告,图表走 Plotly 交互式渲染,在 Jupyter 里内联显示最顺手。另有数据下载、绘图、自动化等模块与第三方库配合使用,模块清单以官方文档目录为准。
vectorbt 里指标算完只是原料,下面这些方法才是把原料变成可执行信号的常见套路。
| 方法 | 作用 | 适用场景 | 注意点 |
|---|---|---|---|
| 序列交叉判断 | 判断两条序列的上下穿关系 | 均线交叉、指标与阈值线交叉 | 交叉点数量与窗口强相关,先统计频率再决定是否采用 |
| 布尔条件组合 | 用与、或、非把多个条件拼成一个信号 | 趋势过滤 + 动量确认 | 条件越多信号越少,容易把有效样本一起筛掉 |
| 阈值比较 | 指标越过固定水平即触发 | 超买超卖、波动率区间判断 | 固定阈值在不同标的、不同波动环境下不可直接套用 |
| 截面排名 | 在同一时点对所有标的横向排序 | 多标的选股与轮动 | 排名要求所有标的指标口径一致,缺失值处理方式必须统一 |
| 信号映射与分组 | 把信号映射成不同规模、方向或分组 | 分批建仓、多空对冲 | 映射规则一旦引入,回测结果对规则的敏感性会显著上升 |
| 信号分布分析 | 统计信号频率、胜率与盈亏分布 | 参数筛选前的可行性判断 | 这是筛选环节而不是优化环节,先排除不可用信号能省下大量算力 |
| 信号后移(shift 一根 bar) | 让信号在下一根 bar 生效 | 所有基于收盘数据的日线策略 | 后移后产生的缺失值需转为布尔类型,否则回测入口会拒绝或报错 |
vectorbt 的均线参数没有普适的较优解,只有「与你研究的标的和周期是否匹配」。下表给的是常见起点与判断依据,真正结论要用样本外回测验证。
| 参数 / 做法 | 常见取值 | 适合的行情 | 注意点 |
|---|---|---|---|
| 短线组合(快 / 慢) | 5 / 20 量级 | 波动大、节奏快的标的 | 信号密集,手续费与滑点会吃掉大部分理论收益 |
| 中短线组合 | 10 / 30 量级 | 中短周期、想兼顾灵敏与稳定 | 最常用的默认起点,但仍需配合趋势或量能过滤 |
| 长线组合 | 20 / 60 量级 | 趋势明显、噪声较小的行情 | 信号少、转折滞后,样本内交易笔数可能不足以下结论 |
| 均线加权方式 | 以官方 API 支持的加权选项为准 | 希望近期价格权重更高的研究 | 不同加权方式结果差异明显,比较时必须固定同一口径 |
| 参数搜索方式 | 网格组合扫描 | 不确定参数区间、需要看参数敏感度 | 关注参数邻域是否稳定,而不是单点极值——孤立的高点通常是过拟合 |
| 样本切分 | 训练段 + 样本外段 | 所有打算落地判断的研究 | 只用样本内较优参数很容易自欺,样本外表现才是筛掉绝大多数参数组的关卡 |
| 成本假设 | 按你的实际费率设定 | 信号频率偏高的策略 | 成本参数应写在策略口径里统一施加,事后挑选是否计成本等于变相择优 |
先定场景、再定指标、最后定参数——在 vectorbt 里顺序反了,后面所有工作都要重做。
| 研究场景 | 选哪些指标 | 参数起点 | 为什么这样选 |
|---|---|---|---|
| 趋势跟随(顺势持有) | 双均线、MACD | 10 / 30 量级起步 | 均线与 MACD 都在刻画趋势方向,交叉给出进出场时点,逻辑直观且易复述 |
| 震荡区间反转 | RSI、布林带 | 常用超买超卖阈值与带宽倍数 | 区间行情下均值回归更有效,动量与波动带更贴合这段行情的性质 |
| 突破确认 | 布林带或波动通道 + 量能条件 | 以波动带宽与放量阈值为准 | 突破最怕假突破,用波动带宽提供阈值、用成交条件做二次确认 |
| 多指标共振 | 趋势指标 + 动量指标组合 | 先各自固定一套参数再联合 | 多条件同时满足能减少假信号,代价是信号频率与样本量同步下降 |
| 控制回撤 | 止损止盈参数 + 仓位约束(辅助指标) | 按可承受回撤反推 | 回撤主要靠止损与仓位管理控制,指望指标预测拐点往往更不可靠 |
| 多标的筛选与轮动 | 截面排名 + 动量类指标 | 排名窗口常取 20 日量级 | 多标的必须口径一致,横截面排名才能保证同一时点可比 |
| 参数寻优流程 | 先用上面的场景组合,再进网格扫描 | 网格 + 样本外验证 | 先去掉不可用的信号组合,再花算力扫参,能显著缩短研究周期 |
均线是滞后指标,vectorbt 里震荡行情的金叉死叉会密集出现假信号,而每次进出都要付手续费与滑点,理论收益很容易被成本吞掉。常见改法是加趋势或量能过滤、拉长窗口、并在样本外段复核——但回测只能验证历史区间表现,不代表未来同样有效,口径以官方实现与你自己的成本假设为准。
它们判断一条序列是否上穿或下穿另一条序列,返回与输入等长的布尔序列,可以直接作为组合回测入口的买入 / 卖出信号。使用时注意两点:缺失值位置会返回 False,以及信号更稳妥的做法是整体后移一根 bar 再加进回测,具体签名与行为以官方 API 文档为准。
可以。既可以在内置指标基类上子类化定义新指标,也可以先用 pandas / NumPy 把指标算成普通序列,再接进信号与回测流程——两条路最后进的都是同一套向量化流程。自定义指标的计算正确性需要你自己负责验证;基类与接口以官方 API 文档为准
不是必须。访问器只是把常用指标包装成便捷写法,本质仍是 pandas 扩展;你也可以完全在 pandas / NumPy 里算好指标,再把结果交给信号与组合入口。混用时只需盯住索引对齐——两条序列索引不一致,布尔运算的结果会静默出错而不是直接报错;访问器用法以官方 API 文档为准
先核对四件事:数据区间是否完全一致(含起止日期与交易日历)、价格是否用了相同复权口径、指标参数与平滑方式是否相同、缺失值处理方式是否一致。这四项里任意一项不同,结果就会系统性偏离;对不上的时候优先怀疑数据与口径,而不是先怀疑指标算错,具体计算定义以官方实现为准。
能。vectorbt 的指标与信号环节只要求输入是「索引为时间、值为价格」的序列,A 股数据只要整理成同样结构即可接入,具体取数方式见数据接入页。本机已核验的技能里,技术分析类与财经数据类技能覆盖的是「一句话做形态与指标分析、拉行情」的方向,与本页讲的代码级指标计算是两条独立路线,双方没有已证实集成;哪条更合适取决于你是要做深度回测还是先快速验证想法;技能能力以官方技能文档为准