Skip to content

我拿Reddit上高赞的趋势策略,认真跑了一遍回测(附代码)

作 者:老余捞鱼

原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。

本文约 2600 字 | 预计阅读 5-8 分钟,建议先收藏。

· · ·

① Reddit上高赞的趋势策略

我在Reddit上刷到一个点赞超多的趋势跟踪策略,帖子里贴的回测数据确实诱人,年化收益翻倍还不止,胜率不到四成,居然还能稳稳赚钱。

策略本身不复杂:

· 收盘价站上20日均线,第二天开盘就买(如果低开更好)。

· 收盘价跌破20日均线,第二天开盘就卖(亏了也割)。

· 但要是买入后亏了8%,不等均线信号,直接止损跑路。

回测时还特意加了交易成本和滑点,信号延迟一个K线才执行,防止“作弊”用到未来数据;8%止损也是用盘中最高/最低价来模拟实际触发,尽量贴近真实交易。Reddit那个帖子里的盈利数字一串串的,看着很漂亮,但我有点怀疑其真实性。

于是我决定自己来用vectorbt跑一遍完整回测。花了一个多小时等代码跑完,最后看到那条收益曲线的瞬间,我才意识到这才是整件事里最有价值的东西,比那些花哨数字重要得多。

② 实测标的:BTC 和 SOL

两个加密资产用同一个策略。从各自的交易起点一直跑到2026年7月。

BTC-USD(2014年9月-2026年7月,224笔交易):

指标数值怎么读
总收益+2,574.5%$1,000 → ~$26,745
年化(CAGR)32.1%不差,但往下看
胜率25.0%每四笔交易只赢一笔
最大回撤-74.3%水下最长连续1,956天
平均盈利+21.7%赢的时候赢得多
平均亏损-3.9%输的时候割得快
盈亏比(Profit Factor)1.16微盈
夏普0.84不算好看
累计手续费$9,579本金$1,000,交了近10倍手续费

BTC:资金曲线 / 回撤 / 买卖信号 / 单笔盈亏

SOL-USD(2020年4月-2026年7月,125笔交易):

指标数值怎么读
总收益+9,217.7%$1,000 → ~$93,000
年化(CAGR)107.0%看着很猛
胜率22.6%还不如BTC
最大回撤-80.5%八成资金蒸发过
平均盈利+63.7%抓到一波就是大肉
平均亏损-6.1%割肉也快
盈亏比(Profit Factor)1.22比BTC略强
夏普1.27还行
累计手续费$17,099125笔,交了近18倍本金的手续费

SOL:同样的规则,波动高一倍,结果差异更大

通过回测可以看到Reddit 帖子里的数字没骗人。规则简单、数据能复现、胜率不到30%但平均盈亏比高到撑出了正期望。 单看这几张表和几根资金曲线,你会觉得”这不挺好的”。

但我顺手加了一行比较:同期买入持有。

绿色实线:策略净值。灰色虚线:买入持有。

然后整个故事的走向就变了。

③ 打脸所有”看起来有效”的策略

如果同期买入不动的回报比你策略高五倍,你的策略到底是在”管理风险”,还是”给交易所打工”?

BTC:策略赚了 +2,574%,买入不动赚了 +12,780%。

SOL:策略赚了 +9,218%,买入不动赚了 +9,201%,打了个平手。

在BTC上做了224笔交易,交了9,579刀手续费,在最大回撤 -74.3% 的水下泡了将近5年半,折腾出来的结果只有买入不动的五分之一。 SOL 上,125笔交易交掉17,099刀手续费,回撤到了 -80.5%,几乎跟把账户清空一样。最后勉强跟买入持有打了个平局。

首先,要承认这个策略的结构本身是自洽的。 盈利交易平均持仓27-28天,亏损交易平均持仓只有3-4天。 8%止损起到了作用:亏的时候砍得够快。 少数几笔大赢家撑着整个策略的收益,大部分交易都是小赚小赔在消费。

但我们回顾下BTC和SOL在过去几年里发生过什么事? 它们走了几段持续数年的大级别上升趋势。 一个用20日均线入场、8%止损出场的策略, 在那种行情里的行为完全可以预测:

· 涨了一段,一根阴线跌破均线,你被甩出来。· 过两天价格收回均线之上,你再追回去。· 又是一根大阴线,8%止损触发,你又被割出来。· 价格继续涨,你再次追进去。

这个过程反复发生,每一次切入和切出都在积累滑点、手续费和时间差。 而那个一直在舱里从来没出来的位置,默默赚了全程涨幅,一次手续费都没交过。

④ 这个策略到底有没有用?

答案是:有价值,但绝对不是你想的那样。

如果你非要把“跑赢买入持有”当成唯一标准,那这个20日均线策略放在BTC和SOL上,基本就是“死刑立即执行”。但这不代表趋势跟踪本身是垃圾,问题是你用错了工具。把一套短线均线规则硬往长期单边暴涨的资产上套,就像拿水果刀去切牛排:刀是好刀,但场合不对。

那这个策略到底什么时候能派上用场?

第一,在震荡市或者均值回归的行情里。买入持有横着不动的时候,趋势规则反而能在上上下下的波段里切出几块肉来。

第二,别把它当成“赚更多”的工具,而是当成“少亏点”的风控信号。用它来决定仓位轻重、杠杆高低。趋势告诉你现在是该在场内,还是该收手。

不过,回测里-74%和-80%的最大回撤也给大家提了个醒:光靠一条20日均线来管风险,可能比你想的还要不靠谱。

所以,一个更实际的改进方向是:加一道“长周期滤网”。比如只在100日或200日均线之上才允许做多。这样一来,在趋势性资产上,你的交易频率会从“全年无休”变成“只在大的上升环境中出手”。

下一轮回测你还可以这么干:同样的规则、同样的两个币,但多设一个条件:大趋势向上,才允许入场。到时候再看效果,应该会比现在好看得多。

以后你无论在哪个论坛晒回测截图,记得在图表下面再补一条线:同期买入持有的资金曲线。

如果折腾半天,连人家啥也不干、从头拿到尾的收益都比不上,那起码你能分清楚:自己到底是在认真做交易,还是在花钱买刺激。

⑤ 核心代码

如果想自己跑一遍,下面是 Python 版的关键部分:

import numpy as np
import pandas as pd
import yfinance as yf
import vectorbt as vbt

# ---- 配置 ----
SYMBOLS = ["BTC-USD", "SOL-USD"]
MA_WINDOW = 20
STOP_PCT = 0.08     # 8% 硬止损
INIT_CASH = 1_000
FEES = 0.001        # 0.10%
SLIPPAGE = 0.002    # 0.20%

end_date = pd.Timestamp.today().normalize()
start_date = end_date - pd.DateOffset(years=20)

for symbol in SYMBOLS:
    df = yf.download(symbol, start=start_date, end=end_date,
                      interval="1d", multi_level_index=False,
                      auto_adjust=True)
    close = df["Close"]
    sma = close.rolling(MA_WINDOW).mean()

    # 信号:上穿/下穿,向后shift 1 bar避免前瞻偏差
    raw_entries = (close > sma) & (close.shift(1) <= sma.shift(1))
    raw_exits   = (close < sma) & (close.shift(1) >= sma.shift(1))
    entries = raw_entries.shift(1).astype(bool).fillna(False).to_numpy()
    exits   = raw_exits.shift(1).astype(bool).fillna(False).to_numpy()

    pf = vbt.Portfolio.from_signals(
        close=df["Open"],     # 用次日开盘价成交,更接近实盘
        entries=entries,
        exits=exits,
        sl_stop=STOP_PCT,
        sl_trail=False,
        high=df["High"],
        low=df["Low"],
        init_cash=INIT_CASH,
        fees=FEES,
        slippage=SLIPPAGE,
        freq="1D",
    )

    print(pf.stats())

如果你在做量化回测,别忘了把你策略的曲线旁边,叠上买入持有那条灰色的线。它就是你的试金石。


#趋势策略 #BTC #SOL #移动平均线 #回测 #加密货币 #买入持有 #量化交易 #Reddit策略 #SMA20 #风险调整

Published inAI&Invest专栏

Be First to Comment

    发表回复