朋友们,你有没有过这种经历:想到了一个"绝妙"的交易策略,兴冲冲地投入真金白银,结果发现根本不赚钱?
在把真钱投进去之前,其实有一种方法可以先验证你的策略是否有效——那就是回测(Backtesting)。
今天我们来聊聊怎么正确地做策略回测。
什么是回测?
回测就是用历史数据来模拟执行你的交易策略,看看如果过去按照这个策略交易,结果会怎样。
打个比方:你发明了一个新的下棋方法,回测就像是拿出过去的棋谱来验证——如果用你的方法走,结果是赢是输?
当然,历史表现不代表未来结果。但至少,一个在历史数据上都赚不到钱的策略,在实盘中赚钱的概率就更低了。
为什么要回测?
1. 验证策略有效性
你以为移动平均线金叉就该买入?回测一下就知道这个策略到底能不能盈利。
2. 量化策略表现
回测可以给你具体的数据:年化收益率、最大回撤、胜率、盈亏比等。有了这些数据,你才能客观评估策略的好坏。
3. 优化参数
同样是均线策略,用7日和25日均线好,还是10日和50日均线好?回测可以帮你找到最优参数。
4. 建立信心
当你知道自己的策略在过去5年的数据上都表现良好时,实盘执行时会更有信心,不容易因为短期波动就放弃。
5. 发现问题
有些策略看起来很好,但可能有隐藏的风险。比如一个策略胜率99%,但那1%的亏损是致命的。回测可以帮你发现这些问题。
回测的基本流程
第一步:明确策略规则
在回测之前,必须把策略的所有规则都写清楚:
- 入场条件:什么情况下买入?
- 出场条件:什么情况下卖出?
- 仓位管理:每次买多少?
- 止损规则:亏多少就平仓?
- 止盈规则:赚多少就平仓?
- 其他约束:最大持仓数量、交易时间限制等
规则越具体越好,不能有任何模糊的地方。如果规则里有"感觉"、"大概"这样的词,说明还不够具体。
第二步:获取历史数据
需要获取你要回测的交易对的历史K线数据。
从币安获取:
from binance.client import Client
client = Client(api_key, api_secret)
# 获取BTC/USDT从2020年到现在的日线数据
klines = client.get_historical_klines(
"BTCUSDT",
Client.KLINE_INTERVAL_1DAY,
"1 Jan 2020",
"1 Jan 2026"
)
数据质量很重要:
- 数据要足够长(至少覆盖一个完整的牛熊周期)
- 数据要准确(开高低收、成交量)
- 时间精度要和你的策略匹配(日线策略用日线数据,分钟策略用分钟数据)
第三步:编写回测代码
用代码模拟策略的执行过程。
简单示例(Python):
import pandas as pd
# 加载数据
df = pd.DataFrame(klines, columns=[
'timestamp', 'open', 'high', 'low', 'close',
'volume', 'close_time', 'quote_volume', 'trades',
'buy_base', 'buy_quote', 'ignore'
])
df['close'] = df['close'].astype(float)
df['ma7'] = df['close'].rolling(7).mean()
df['ma25'] = df['close'].rolling(25).mean()
# 模拟交易
position = 0 # 0=空仓, 1=持仓
entry_price = 0
trades = []
for i in range(25, len(df)):
# 金叉买入
if df['ma7'].iloc[i] > df['ma25'].iloc[i] and \
df['ma7'].iloc[i-1] <= df['ma25'].iloc[i-1] and \
position == 0:
position = 1
entry_price = df['close'].iloc[i]
# 死叉卖出
elif df['ma7'].iloc[i] < df['ma25'].iloc[i] and \
df['ma7'].iloc[i-1] >= df['ma25'].iloc[i-1] and \
position == 1:
position = 0
exit_price = df['close'].iloc[i]
profit = (exit_price - entry_price) / entry_price
trades.append(profit)
# 统计结果
if trades:
wins = [t for t in trades if t > 0]
losses = [t for t in trades if t <= 0]
print(f"总交易次数: {len(trades)}")
print(f"胜率: {len(wins)/len(trades)*100:.1f}%")
print(f"平均盈利: {sum(wins)/len(wins)*100:.2f}%" if wins else "无盈利")
print(f"平均亏损: {sum(losses)/len(losses)*100:.2f}%" if losses else "无亏损")
print(f"总收益: {(1+sum(trades)/len(trades))**len(trades)-1:.2%}")
第四步:分析回测结果
回测完成后,需要分析以下关键指标:
年化收益率:策略的年化回报。和直接持有(Buy & Hold)对比。
最大回撤:从最高点到最低点的最大跌幅。回撤太大的策略在实盘中可能承受不了。
夏普比率:衡量风险调整后的收益。一般认为夏普比率大于1是可以接受的,大于2是优秀的。
胜率:盈利交易占总交易的比例。胜率不是越高越好,关键看和盈亏比的配合。
盈亏比:平均盈利/平均亏损。盈亏比大于1.5比较好。
交易频率:交易次数是否合理?太频繁手续费太高,太少数据不够可靠。
收益曲线:画出资金曲线图,看是平稳上升还是大起大落。
第五步:优化和验证
根据回测结果调整参数,然后重新回测。但这里有个大坑——过度优化。
常见的回测陷阱
陷阱一:过度拟合(Overfitting)
这是最常见也最危险的陷阱。
过度拟合就是:你不断调整参数直到策略在历史数据上表现完美,但这些参数只适用于历史数据,在新数据上可能完全失效。
怎么避免:
- 把数据分成"训练集"和"测试集",用训练集优化参数,用测试集验证
- 参数不要太多。越多的参数越容易过度拟合
- 策略逻辑要有市场逻辑支撑,不要纯粹拟合数据
陷阱二:前瞻偏差(Look-Ahead Bias)
在回测中使用了当时不可能知道的信息。
例子:用今天的收盘价来决定今天的交易——但在实际交易中,你不可能在交易时就知道收盘价是多少。
怎么避免:确保每个交易决策只使用该时间点之前的数据。
陷阱三:忽略交易成本
回测中不考虑手续费、滑点等成本。
一个看起来收益率30%的策略,扣除手续费后可能只有10%甚至亏损。特别是高频策略,手续费的影响非常大。
怎么避免:在回测中加入真实的手续费率(参考你的VIP等级),并考虑滑点成本。
陷阱四:幸存者偏差(Survivorship Bias)
只回测当前还存在的币种,忽略了那些已经归零退市的币种。
如果你只回测现在排名前20的币种,结果当然好——因为它们是"幸存者"。但在几年前,你不知道哪些币会幸存。
陷阱五:忽略市场环境
2021年牛市中几乎任何策略都能赚钱。如果你的回测只覆盖了牛市,那策略在熊市中可能表现很差。
怎么避免:回测数据要覆盖至少一个完整的牛熊周期。
回测工具推荐
TradingView Pine Script
如果你不太会编程,TradingView的Pine Script是最简单的入门工具。
- 直接在图表上编写和运行策略
- 内置的策略测试器可以自动生成回测报告
- 可视化效果好
- 适合中低频策略的回测
Python + Backtrader
Backtrader是Python最流行的回测框架之一。
- 功能强大,支持各种策略类型
- 可以自定义指标和交易逻辑
- 支持多品种、多策略
- 学习曲线稍陡
Python + Zipline
由Quantopian(已关闭)开发的回测框架。
- 代码结构清晰
- 社区资源丰富
- 适合股票市场但也可用于加密货币
币安历史数据
币安提供了完整的历史K线数据下载,你可以用它来做回测:
- 通过API获取数据
- 或在币安数据页面直接下载CSV文件
从回测到实盘
回测通过后,不要直接上大资金实盘。建议按这个顺序:
1. 模拟盘测试
先用模拟资金运行策略至少1-3个月。观察实际表现是否和回测一致。
2. 小资金实盘
用总资金的5%-10%来实盘运行。这一步很重要,因为实盘会遇到很多回测中没有的问题(滑点、API延迟、网络问题等)。
3. 逐步加仓
如果小资金实盘3个月以上表现稳定,逐步增加资金。
4. 持续监控
实盘运行后需要持续监控策略表现。如果实际表现持续偏离回测预期,需要重新评估策略。
实战建议
-
简单的策略往往更好。参数越少、逻辑越清晰的策略越不容易过度拟合。
-
不要追求完美回测。一个年化20%、最大回撤10%的策略,比年化100%、最大回撤50%的策略更值得信赖。
-
多周期验证。在不同的时间段都回测一遍,看看策略的稳定性。
-
考虑实际可执行性。有些策略在回测中可行,但实际执行起来不现实(比如需要在1秒内完成操作)。
-
建立回测习惯。每当你有新的交易想法,先回测再执行。这个习惯能帮你避免很多冲动交易。
总结
回测是建立交易系统的基础步骤。它不能保证未来一定赚钱,但至少能帮你过滤掉明显不可行的策略。
记住回测的核心原则:
- 规则要明确具体
- 数据要足够长且准确
- 警惕过度拟合
- 考虑全部交易成本
- 从回测到实盘要循序渐进
花时间学会回测,远比花时间在市场上交"学费"来得划算。
准备好开始验证你的策略了吗?先注册币安账户获取历史数据吧。