作 者:老余捞鱼
原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。
本文约 3000 字 | 预计阅读 5-8 分钟,后有代码下载,建议先收藏。
· · ·
前阵子逛 TradingView 的脚本市场,看到一个指标名叫 “TraderLifestyle Space Concept Pro”,太空概念,名字挺唬人。
逻辑倒不复杂。它看三样东西:价格、20 周期简单移动平均线(20 SMA)、200 周期简单移动平均线(200 SMA)。关键变量是这三者之间的“间距”。
趋势强的时候,价格远远甩开 200 SMA,间距拉大。横盘震荡的时候,三者拧在一起,间距压到极小。
指标把这个间距量化成 “Spread Rank”。本质很简单:当前间距在过去 100 个周期里排第几。数字高说明间距宽,数字低说明间距窄。

它产两种信号:
第一种是突破信号。Spread Rank 掉到多个月低点,间距被压缩到极致之后,一根大区间 K 线把价格踹出这个紧窄范围。逻辑跟弹簧一样:压到底的时候,弹出来的第一下力道最足。
第二种是反转信号。Spread Rank 冲到多个月极端值,价格远远偏离均线之后,第一次出现拐头迹象。逻辑同样直白:弹簧拉太长,回弹是大概率事件。
仓位管理也不复杂。先止盈 50%,剩下的挂逐 K 线跟踪止损。原版指标还有个追加规则:盈利仓位首次出现延续信号时加码。但规则没说加多少,回测里只记录事件,不调仓位。这个缺口后面会细说。
我干了一件自己常做的事:把这套主观逻辑一字不改地翻成 Python 代码,用 PSEC(Prospect Capital Corporation,一家 BDC 公司)跑了 22 年的日线回测。
借这篇文章,把策略逻辑、数据和四个问题一起拆给你看。
一、回测逻辑
好,逻辑说完了,上数据。我设置的参数可以用“老实”来形容:
- 标的:PSEC,2004 年 7 月到 2026 年 7 月
- K 线:日线
- 初始资金:10 万美元
- 佣金:0.1%,滑点:0.2%
- 执行方式:当日收盘确认信号,次日开盘成交
- 交易总笔数:102 笔,横跨约 22 年
我没有事后挑标的,PSEC是从一批扫描结果里选出来的,选它纯粹因为交易笔数够多,能讲出点统计意义。不是因为它跑得最好。
如果是事后挑跑得最漂亮的那只票看图说话,谁都会。
二、回测数据
回测跑完,完整绩效数据长这样:

| 回测区间 | 2004.7 ~ 2026.7(5529天) | 终值 | $312,379 |
| 总收益率 | 212.38% | 持有不动基准收益 | 85.56% |
| 胜率 | 68.32% | 总交易数 | 102笔 |
| 盈利因子 | 1.58 | 期望值 | $2,126/笔 |
| 平均盈利交易 | +9.05% | 平均亏损交易 | -5.19% |
| 平均盈利持仓 | 62.5天 | 平均亏损持仓 | 18.9天 |
| 最佳单笔 | +86.58% | 最差单笔 | -11.89% |
| 最大回撤 | -50.75% | 回撤恢复时间 | 1512天(4.1年) |
| 夏普比率 | 0.40 | Calmar比率 | 0.15 |
| Sortino比率 | 0.59 | Omega比率 | 1.10 |

先看好的一面。
相对持有不动跑出了 2.5 倍的超额收益,三分之二以上的交易赚钱。盈亏比接近 1.8:1,平均一笔赚 9% 亏 5%。一个主观看图工具,从没被设计来跑回测,能交出这种数据,已经有点意外了。
同期买入持有PSEC的收益是85.56%,策略跑出了2.5倍超额。
但真正该盯着看的,在下面。
三、四个让人冷静的理由
第一,回撤太深,也太久。
50.75% 的回撤不是小波动。投 10 万,最惨的时候净值剩不到 5 万。而且在水下泡了四年多才浮起来。
这不是数学问题而是人性问题,回测里的收益率是机器跑出来的。真实世界里的交易者,没人能在亏了两年、亏了 40% 的时候心平气和地告诉自己:策略还没失效。绝大多数人会在谷底割掉,然后眼睁睁看着曲线反弹。
一个策略的回测收益如果来自一段没有活人能扛过去的回撤期,那个收益数字就跟彩票中奖者聊自己的“选号策略”差不多。统计学上存在,现实里不可复制。
第二,夏普和 Calmar 不怎么样。
夏普 0.40、Calmar 0.15,到底是什么水平?
夏普衡量每承担一单位波动换来的超额收益。0.40 不算差到离谱,但离系统性的稳定优势还远。经验上看,夏普过 0.5 才值得多看两眼,过 1.0 才算真正的强优势。0.40 的意思很简单:收益率里的噪音跟信号差不多一样多。
Calmar 0.15 更直观。它等于年化收益除以最大回撤。你冒了亏一半本金的风险,每年就多赚了那么点。任何正经的配置框架都不会让这种风险回报比通过。
这两个数字放在一起说的话很明确:策略确实在这个窗口、这只票上赚到了钱。但赚的过程充满了波动和不确定性。优势和噪音的边界是模糊的。
第三,一只票加一段历史,什么都说不清。
PSEC 自己历史上经历了 2008-2009 的大崩盘、2020 年后的修复行情。任何策略在经历过这些特定事件的标的上跑出好成绩,都有可能是命运的巧合,不是逻辑的必然。
一次回测跑出一条漂亮曲线,不叫发现了规律。叫获得了一个需要进一步验证的猜想。两者的区别,是爱好者跟从业者的那条分界线。
第四,原版指标的追加规则被故意跳过了。
Space Concept Pro 的原始脚本里有个追加逻辑:盈利仓位首次出现延续信号时触发加码。但脚本没写加多少。
我选择不给它编数字。只记录事件,不动仓位。
实盘用这个指标的人大概率会执行追加。意味着真实的权益曲线会比回测显示得更颠簸。回测里勉强能接受的那段回撤,加了仓之后可能是另一条更陡的曲线。
四、碰实盘之前,建议至少做五件事
针对上面四个理由,我设计了五项验证:
- 全多标的扫描。一只票上的优势,换十只票可能消失。需要跑一个完整的标的池:同行业、跨行业、大盘、小盘。看这个逻辑的优势是广泛分布的,还是只出现在极少数名字上。20 只票里只在 2 只上有效,那基本是运气。
- 滚动前向验证。22 年回测里跑得好的参数,可能是对这 22 年特定路径做了过度拟合。正确做法是锁定参数,12 个月训练,接下来 6 个月验证,逐年滚动。看样本外表现还能不能站住。参数在样本内越精细,在样本外越容易塌。
- 蒙特卡罗重采样。102 笔交易的顺序换一下会怎样?212% 的收益有多少来自信号质量,有多少来自这 102 笔交易恰好按有利的顺序发生了?把交易序列随机打乱一万次,看收益分布的形态。如果重采样的中位数收益率大幅低于原始序列,答案就很清楚了。
- 追加行为真实核算。原版指标的追加逻辑必须建模。哪怕假设每次追加固定比例(比如初始仓位的 50%),至少要搞清楚这个行为对权益曲线的影响方向和量级。故意跳过一个真实存在的规则,回测结果就没有现实意义。
- 跨市场机制的压力测试。2008 年式高波动熊市、2020 年 3 月流动性急跌、一段真正多年的横盘市。策略在这三种环境下分别表现如何?只在趋势市中赚钱、横盘市连续亏钱的策略,必须搭市场机制过滤器才能考虑上线。不搭的话,回测里的曲线到了实盘会被横盘吃光。
五、回测的正确姿势
Space Concept 这个案例让我想起一个反复出现的模式。
交易社区里最流行的一类内容就是:“我发现了一个胜率 XX% 的指标”。贴一张 K 线图,画几条线,标几个买卖点,然后说:你看全对。
这种东西传播性极强。信号清晰,结果明确,给人一种“我也能做到”的感觉。
但真正的回测,目的不是找证据证明策略有效。是找证据证明它无效。
把策略逻辑写成代码,严格设定滑点和执行延迟,用尽可能多的标的数据去跑。然后盯着回撤深度和恢复时间,盯着夏普和 Calmar,盯着样本外表现。在所有角度都试过证伪它之后,它还能站住,那个优势才值得认真对待。
Colab地址:
https://colab.research.google.com/drive/1PiXtE_37Qokmmc6qs0nhROds9ieoH1ek
代码下载地址:
http://www.laoyulaoyu.com/code/SpaceCPro.zip
Space Concept 本身好不好用不是重点,重点是这套验证框架是通用的:无论你对哪个指标、哪只票做回测,方法论是一样的。
这才是量化策略该有的样子。
#TradingView指标 #量化回测 #策略验证 #SpaceConcept #夏普比率 #最大回撤 #Python回测 #PSEC #交易系统 #蒙特卡罗
Be First to Comment