一、为什么要先学回测?
回测(Backtesting),就是拿历史数据去"重放"你的交易规则,看看这套规则在过去表现如何。
量化交易和拍脑袋交易最大的区别就在这里:你的策略在上真金白银之前,先被历史数据检验过。
重要提醒:本文是 Python 回测的编程科普,不构成任何投资建议。回测结果好不代表实盘能赚钱,甚至回测本身也可能骗人——后面会讲原因。
二、写回测前,先准备什么?
只需要三样东西:
- Python 环境:推荐用 Anaconda 或直接装官方 Python 3,再安装 pandas(数据分析库)
- 历史 K 线数据:主流交易所都提供历史行情,也可通过 ccxt 等库直接拉取
- 一个想法:比如"金叉买入、死叉卖出"这种最简单的规则
如果你想同时熟悉交易所的行情接口和模拟盘,可以先去注册熟悉一下:币安 https://newbeebnb.cn/go?t=join https://newbeebnb.cn/go?t=okxo。数据拉取请遵守各平台的接口使用规范。
三、你的第一个回测:双均线策略
思路很简单:短期均线上穿长期均线(金叉)时持有,下穿(死叉)时空仓。
假设 df 是你从交易所下载的日线数据,包含收盘价 close,完整代码如下:
import pandas as pd
# 1. 计算快慢两条均线
df['ma_fast'] = df['close'].rolling(20).mean() # 20 日均线
df['ma_slow'] = df['close'].rolling(60).mean() # 60 日均线
# 2. 生成信号:快线在上方 = 1(持有),否则 = 0(空仓)
df['signal'] = (df['ma_fast'] > df['ma_slow']).astype(int)
# 3. 信号延迟一天生效,避免"偷看未来"
df['position'] = df['signal'].shift(1)
# 4. 计算每日收益并累乘,得到策略净值曲线
df['daily_ret'] = df['close'].pct_change()
df['strategy_ret'] = df['daily_ret'] * df['position']
df['equity'] = (1 + df['strategy_ret']).cumprod()
# 5. 看一眼结果
df[['close', 'ma_fast', 'ma_slow', 'equity']].tail()
跑完你会发现:代码只有十几行,真正的难点在后面怎么解读结果。
四、回测结果怎么读?
别只盯着"总收益率",至少要看这五个数字:
| 指标 | 含义 |
|---|---|
| 总收益率 | 策略整个区间的累计表现 |
| 最大回撤 | 从最高点最多亏了多少,衡量"难受程度" |
| 胜率 | 盈利交易占总交易的比例 |
| 盈亏比 | 平均盈利和平均亏损的比例 |
| 交易次数 | 次数太少说明样本不足,结论不可靠 |
判断标准很简单:最大回撤你晚上睡得着觉吗? 睡不着,说明仓位和策略不适合你。
五、回测的坑:结果好不代表能赚钱
- 过拟合:参数反复调到"历史完美",换个时间段就失效
- 幸存者偏差:只回测现在还在的币,退市的币没人管,结果虚高
- 忽略手续费和滑点:没扣成本的回测收益,实盘会大打折扣
- 偷看未来:用了当天收盘才知道的数据去决定当天的买卖,属于作弊
所以回测结论要打折看:策略至少要在不同时间段、不同币种上表现稳定,才有参考价值。
六、下一步怎么走?
- 先把上面的代码跑通,看懂每一行在做什么
- 加上手续费和滑点,让回测更接近真实
- 用更多币种、更长历史验证稳定性
- 想实盘?先在交易所模拟盘/测试网用小资金流程跑通,再考虑真实资金
七、风险提示(重要)
⚠️ 量化回测与实盘请务必注意:
- 回测不代表未来:历史表现不能保证未来收益,策略随时可能失效
- 技术风险:程序 bug、网络中断、接口限流都可能导致实盘异常
- 安全风险:API 密钥务必保管好,不要泄露给任何人或第三方工具
- 合规风险:遵守所在国家或地区的法律法规与交易所使用条款
一起交流量化学习
写代码卡住、回测结果看不懂、想找人一起交流 Python 量化学习心得,欢迎加入我们:
- QQ 群:#QQNUM#(点击加入:https://jq.qq.com/?_wv=1027&k=)
- Telegram:https://t.me/ChenBitget
- Bilibili:https://space.bilibili.com/261535048
- Twitter(X):https://x.com/ChenBitget
我们会分享代码示例、学习路线和避坑经验,一起把量化基础打扎实!