个人回测平台的搭建指南(三):使用虚拟资金完成一次 ETF 回测测试
上一篇,我们已经搭建了回测平台的雏形,并在功能上已经形成了一个完整闭环流程。在本章我们将使用虚拟资金通过一个简单的 etf 策略来进行系统的测试。
回测的意义不是证明某个策略一定赚钱,而是检查这套规则在历史行情中是否能形成完整闭环:什么时候买入、什么时候卖出、资金如何变化、手续费和滑点是否计入、最大回撤是否可接受,以及策略是否存在频繁交易的问题。
本文只讨论系统测试和策略验证,不构成任何投资建议。
一、这次测试要验证什么
本次回测主要验证四件事:
- 策略能否根据历史日 K 自动生成买卖点。
- 虚拟资金、持仓数量、手续费和滑点是否能正确计算。
- 收益率、最大回撤、胜率、交易次数等指标是否能反映策略表现。
- 策略是否具备进入“准实盘观察”的价值。
当前系统仍然定位为个人辅助决策工具,不是自动交易系统。回测结果只能说明策略在历史数据上的表现,不能直接推导出未来收益。
二、当前使用的回测规则
当前平台默认使用的是 ETF_TREND,也就是 ETF 趋势策略。
买入条件大致如下:
技术评分 >= 70 |
卖出条件满足任意一个即可:
收盘价 < MA10 |
这套规则本质上是一个趋势跟随策略:当 ETF 价格站上中期均线,短期趋势开始转强,并且 RSI 没有明显过热时买入;当价格跌破趋势支撑或动能转弱时退出。
需要注意的是,这不是高频策略,也不是盘口撮合策略。当前回测基于日 K 数据运行,交易价格按收盘价加减滑点进行模拟。
三、回测参数设置
本次回测使用虚拟资金,不涉及真实下单。
| 参数 | 数值 | 说明 |
|---|---|---|
| 初始资金 | 10000 | 本次模拟投入资金 |
| 仓位比例 | 0.95 | 单次买入最多使用 95% 现金 |
| 手续费 | 0.0003 | 按成交额计算 |
| 滑点 | 0.0005 | 用来模拟实际成交偏差 |
| 最小交易单位 | 100 | 买入数量按 100 份取整 |
| 策略类型 | ETF_TREND | ETF 趋势策略 |
如果只是做小资金测试,也可以把初始资金设置为 1000 元。但要注意,ETF 有最小交易单位限制,资金过小可能导致可买数量不足,回测结果会更容易受到取整影响。
四、完整测试流程
4.1 获取标的行情数据
这次先用两个 ETF 做测试:
| 代码 | 标的 | 用途 |
|---|---|---|
| 510300 | 沪深300ETF | 宽基 ETF 测试 |
| 588170 | 科创类 ETF | 波动更高的主题 ETF 测试 |
先以 510300 为例,获取从 2024 年 1 月 1 日到当前日期的历史日 K 数据。

为了避免数据源本身出错,我又打开同花顺进行价格比对,主要检查最新交易日、收盘价和走势是否一致。

这一步很重要。回测系统里最容易被忽略的不是策略,而是数据质量。如果行情数据缺失、日期错位、价格异常,后面所有指标和收益结果都会失真。
4.2 计算技术指标
行情数据确认后,进入 K 线详情页计算指标。
当前系统会生成这些指标:
MA5 |

这些指标会保存为每日快照,后续的技术评分、信号生成和回测都会基于这些快照进行。
4.3 生成技术信号
指标计算完成后,点击“生成信号”。系统会根据 ETF 策略规则生成不同类型的技术信号,例如:
BUY_CANDIDATE |
其中 BUY_CANDIDATE 代表该标的进入技术候选状态,后续可以继续做 AI 风险分析或模拟回测。
510300 的最新技术信号如下:

从信号结果看,系统当时并不建议直接买入。这个结果并不影响本次测试,因为本篇重点是验证回测链路是否跑通,以及策略在历史区间内的整体表现。
接着我换成 588170,重复获取行情、计算指标和生成信号的流程。

可以看到,588170 的技术评分更高,说明它在当前规则下更接近趋势策略的买入条件。
五、运行模拟回测
5.1 配置回测参数
进入:
模拟回测 / Backtest |
本次测试参数如下:
策略模式:ETF 趋势策略 |
这里的手续费和滑点虽然不高,但必须保留。因为一旦交易次数变多,这些看似很小的成本会明显侵蚀收益。
5.2 系统如何逐日回测
点击“运行回测”后,系统会按交易日逐日推进:
读取当天 K 线 |
当前回测采用的是简化交易模型:
| 项目 | 当前处理方式 |
|---|---|
| 买入价格 | 当日收盘价 × (1 + 滑点) |
| 卖出价格 | 当日收盘价 × (1 - 滑点) |
| 手续费 | 成交额 × 手续费率 |
| 买入数量 | 按最小交易单位向下取整 |
| 持仓方式 | 当前策略为单标的持仓 |
这套模型已经能覆盖基础模拟交易,但还不是完全真实的实盘撮合。
5.3 查看回测结果
运行趋势策略后,系统给出了资金曲线、当前持仓和交易明细。


回测完成后,重点在于如下的这些指标:
| 指标 | 观察重点 |
|---|---|
| 最终权益 | 资金最终变成多少 |
| 总收益率 | 整个区间的整体收益 |
| 年化收益率 | 把区间收益折算成年化后的结果 |
| 最大回撤 | 从高点到低点的最大亏损幅度 |
| 胜率 | 盈利交易占已闭合交易的比例 |
| 交易次数 | 是否存在过度交易 |
| 资金曲线 | 收益是否平稳,还是大起大落 |
| 买卖记录 | 具体信号是否合理 |
这里只看收益率是不够的。收益高但回撤很大,说明策略波动强;胜率低但还能赚钱,说明收益可能依赖少数几笔大盈利;交易次数太多,则可能说明策略在震荡行情里被反复洗出。
六、将回测结果交给 AI 做二次分析
这次我们没有直接依赖系统内置的 LLM 分析,而是把回测结果整理成结构化文本,再手动交给 GPT 做二次分析。
输入模板大致如下:
# ETF 回测结果分析请求 |
这样做的好处是,AI 不只看到一个最终收益率,而是能同时看到收益、回撤、胜率、交易次数和交易明细。分析会更接近真实复盘,而不是只围绕单个指标下结论。
七、结果分析
7.1 510300:收益为正,但策略质量一般
510300 的回测结果是:
| 指标 | 结果 |
|---|---|
| 最终权益 | 10,303.76 |
| 总收益率 | 3.04% |
| 最大回撤 | -11.46% |
| 交易记录数 | 50 |
| 已闭合交易数 | 25 |
| 胜率 | 24.00% |
| 盈亏比 | 1.16 |
这个结果说明策略最终赚钱了,但质量并不高。
主要问题有三个:
- 收益偏薄。 一年回测收益只有 3.04%,很容易被参数、交易成本或市场环境变化抹平。
- 交易次数偏多。 一年 50 条交易记录,说明策略在震荡行情中频繁进出。
- 胜率偏低。 25 笔闭合交易中只有 6 笔盈利,策略主要依赖少数盈利交易覆盖大量小亏损。
对 510300 来说,这套策略还不适合直接进入实盘。更合理的做法是继续优化过滤条件,比如提高买入阈值、加入趋势确认天数、减少连续买卖、或者增加买入持有基准对比。
7.2 588170:表现更好,但不能过度乐观
588170 的结果明显好于 510300,说明系统能在更强趋势的 ETF 上捕捉到行情。
但这并不代表策略已经稳定。主题 ETF 本身波动更大,趋势行情里收益可能很好,一旦进入震荡或回撤阶段,策略也可能迅速失效。
所以对 588170 的判断更适合是:
可以小仓位准实盘观察,但不适合直接重仓。 |
如果后续要继续测试,需要增加不同年份、不同市场风格下的回测,尤其要观察下跌和震荡区间里的表现。
八、这次测试暴露的问题
这次测试跑通了完整流程,但也暴露出几个下一阶段必须解决的问题。
8.1 需要加入买入持有基准
当前只看到策略自身收益,还看不到它是否跑赢“买入并持有”。
如果 ETF 本身一年涨了 20%,策略只赚了 3%,那策略就是失败的;如果 ETF 本身下跌,策略还能控制回撤,那才说明它有价值。
下一步应该加入:
ETF 趋势策略收益 |
8.2 需要保存每次回测记录
只看一次回测结果,很难判断策略是否稳定。系统应该保存每次回测的参数、收益、回撤、交易明细和资金曲线,方便后续横向对比。
例如:
同一只 ETF,不同参数对比 |
8.3 需要更真实的交易假设
当前回测已经计入手续费和滑点,但仍然有简化:
没有 T+1 延迟 |
这些不会影响系统第一阶段测试,但如果未来进入准实盘观察,就需要逐步补齐。
8.4 需要降低震荡行情中的误触发
从 510300 的交易记录看,系统在震荡行情中容易频繁买入又快速卖出。这说明买入条件还不够严格,卖出条件也可能过于敏感。
后续可以考虑:
买入前要求连续站上 MA20 |
九、交易日志的作用
回测只能告诉我们历史表现,交易日志更适合用来观察系统在真实时间推进中的表现。
如果某一天系统给出 BUY_CANDIDATE 或最终交易决策,可以在交易日志中记录:
当天 K 线状态 |
后续再回看这些记录,就能知道自己有没有按计划执行,也能判断系统信号在真实环境下是否有效。
十、结论
本次测试说明,当前平台已经能跑通一套完整的 ETF 回测流程:
获取行情数据 |
但从结果看,当前策略还不能直接进入实盘。510300 的收益偏薄、交易次数偏多、胜率偏低;588170 表现更好,但更依赖趋势行情和标的波动。
下一阶段的重点不是马上接入自动交易,而是提高策略可信度:
保存历史回测记录 |
只有当策略在不同标的、不同年份和不同市场环境下都能保持相对稳定,才适合进入小资金、低仓位的准实盘观察。

交流与讨论
评论由 Valine / LeanCloud 提供,点击后连接第三方服务。