回测(Backtesting)是通过使用历史市场数据来验证交易策略表现的过程。它的核心作用是评估你的交易策略在过去的市场条件下是否能够盈利,从而在实际投入资金前发现潜在问题。回测会模拟策略在历史价格数据上的交易行为,包括入场、出场、手续费和资金管理,最终输出一系列绩效指标,如总收益率、胜率、最大回撤等。这有助于你判断策略是否具有统计上的优势,而不是依赖运气。但请注意,回测结果不能保证未来表现,因为它无法完全模拟真实市场中的滑点、流动性变化或情绪影响。
回测需要两个基本前提:一是你已经编写好一个有效的交易策略(保存在 user_data/strategies/ 目录下的 Python 文件中),二是你必须拥有与策略所使用的交易对和时间周期相匹配的历史行情数据(OHLCV 数据)。这些数据默认存储在 user_data/data/<exchange> 目录下,例如 user_data/data/binance/。如果所需数据不存在,系统会提示你使用 freqtrade download-data 命令下载。此外,你还需要配置好策略参数(如最小收益、止损、最大持仓数等)和资金起始余额,才能开始回测。
启动一个基本回测的最简单命令是:freqtrade backtesting --strategy AwesomeStrategy。其中 AwesomeStrategy 是你策略文件中定义的类名,该文件必须位于 user_data/strategies/ 目录下。此命令默认使用 5 分钟(5m)时间周期的历史数据,并采用配置文件中设置的参数(如起始资金、最大持仓数等)。如果你没有指定其他参数,系统将使用默认的交易对列表、数据目录和手续费率进行回测。
你可以使用 --timeframe 参数来指定回测所用的时间周期。例如,要使用 1 分钟(1m)数据进行回测,命令为:freqtrade backtesting --strategy AwesomeStrategy --timeframe 1m。同样,你也可以使用 15m、1h、4h、1d 等其他周期。时间周期的选择会影响策略信号的频率和交易行为:较短周期会产生更多交易,但手续费成本更高;较长周期交易更少,但信号更稳定。确保你已下载对应时间周期的历史数据,否则回测将失败。
回测的起始资金可以通过命令行参数 --dry-run-wallet <balance> 或 --starting-balance <balance> 设置,也可以在配置文件中使用 dry_run_wallet 字段指定。例如,--dry-run-wallet 1000 表示起始资金为 1000 单位的计价货币(如 BTC 或 USDT)。这个金额必须大于你策略中设定的 stake_amount,否则策略将无法执行任何交易。起始资金是计算总收益率、最大回撤和最终余额的基础,因此应根据你的实际预期资金规模合理设置。
如果你将历史数据下载到了非默认路径(例如 user_data/data/binance-20180101),你可以使用 --datadir 参数指定该目录。例如:freqtrade backtesting --strategy AwesomeStrategy --datadir user_data/data/binance-20180101。这在你需要测试特定时间段的数据(如 2018 年牛市)或使用来自不同交易所的数据时非常有用。确保该目录包含正确的交易对和时间周期的 .json 或 .feather 文件,否则回测可能因数据缺失而失败。
你可以使用 --timerange 参数精确控制回测所使用的数据时间段。支持的格式包括:
--timerange=20190501-:从 2019 年 5 月 1 日开始到数据结束
--timerange=-20180131:从最早数据到 2018 年 1 月 31 日
--timerange=20180131-20180301:从 2018 年 1 月 31 日到 2018 年 3 月 1 日
--timerange=1527595200-1527618600:使用 POSIX 时间戳范围
这在你只想测试特定市场周期(如牛市、熊市或震荡市)时非常有用,能避免无关数据干扰策略评估。
回测结果包含三个主要表格:
- 交易明细表:列出所有已平仓和未平仓的交易,每行显示交易对、交易次数、平均收益率、总盈利(BTC)、总收益率、平均持仓时间、胜/平/负次数和胜率。
- 未平仓交易表:展示回测结束时仍持有的仓位,这些仓位因测试结束而被强制平仓,用于反映真实情况。
- 出场原因统计表:统计每种出场方式(如止盈、止损、信号卖出)发生的次数及对应的胜率,帮助你判断哪种出场逻辑更有效。
最后一行的 TOTAL 汇总了所有交易的整体表现,是评估策略成败的核心依据。
‘绝对盈利’(Absolute profit)是指你的账户在回测期间实际赚取的金额,单位为计价货币(如 BTC)。例如,从 0.01 BTC 增长到 0.01762792 BTC,绝对盈利为 0.00762792 BTC。
‘总收益率’(Tot Profit %)则是相对于起始资金的百分比增长,计算公式为:(最终余额 - 起始余额) / 起始余额 × 100%。在示例中,(0.00762792 / 0.01) × 100 = 76.2%。这两个指标结合使用才能全面评估策略:高绝对盈利但低收益率可能是因为起始资金大,而高收益率但低绝对盈利可能意味着策略只适合小资金。
这些是衡量策略风险调整后收益的关键指标:
- CAGR %(年化复合增长率):将回测期间的总收益换算为年化增长率,便于比较不同周期策略的长期潜力。
- Sharpe 比率:衡量单位总风险(波动率)所获得的超额收益。数值越高,策略越稳健,一般 >1 视为良好,>2 优秀。
- Sortino 比率:与 Sharpe 类似,但只考虑下行波动(亏损波动),更关注投资者最关心的亏损风险,数值越高越好。
- SQN(系统质量数):由 Van Tharp 提出,综合评估策略的收益一致性、胜率和盈亏比,>1.5 可接受,>2.5 优秀,>3 非常强。
这些指标比单纯看收益率更重要,因为它们揭示了策略是否在可控风险下获得收益。
最大回撤(Drawdown)是指在回测期间,账户资金从最高点下降到随后最低点的最大百分比或绝对金额。例如,账户从 0.01846651 BTC 高点跌至 0.01696651 BTC 低点,回撤为 0.0015 BTC,占高点的 8.1%。
它至关重要,因为即使策略总收益很高,但如果期间出现剧烈亏损,你可能因心理压力或资金不足而提前停止策略。最大回撤帮助你评估策略的‘心理承受力’和资金安全边际。如果最大回撤超过你能接受的范围(如 20%),即使收益再高也应谨慎使用。
‘拒绝入场信号’表示策略生成了买入信号,但由于当前持仓数已达到 max_open_trades 的上限,系统无法开新仓,因此这些信号被忽略。例如,若 max_open_trades=3,而某时刻有 5 个信号同时出现,则有 2 个信号会被拒绝。这个数字越高,说明策略信号过于频繁或资金利用率不足。你可以通过增加 max_open_trades 或优化信号过滤逻辑来减少拒绝率,提高资金使用效率。
你可以使用 --breakdown day、--breakdown week 或 --breakdown month 参数来生成时间维度的盈利分解表。例如:freqtrade backtesting --strategy MyStrategy --breakdown day week 会输出两个表格:
- 每日表:显示每一天的净盈利、盈利天数、亏损天数和无交易天数。
- 每周表:按周汇总(以周日为结束),显示每周总盈利和交易分布。
这有助于识别策略是否在特定时间段表现异常(如周末亏损、周一盈利),从而优化交易时间或避免高风险时段。
默认情况下,回测结果会自动保存为 ZIP 压缩文件,存储在 user_data/backtest_results/ 目录中,文件名格式为 backtest-result-<datetime>.zip。该文件包含:
- 回测报告(JSON 格式)
- 市场变化数据(Feather 格式)
- 策略文件副本
- 配置文件副本(已脱敏)
你可以使用 freqtrade plot-dataframe 命令加载这些文件进行可视化分析,或在 Web 服务器模式中导入以交互式查看。此外,你还可以用 Python 加载 JSON 文件到 Pandas DataFrame 中,进行自定义统计分析(如计算夏普比率、绘制盈亏曲线)。
尽管回测使用历史数据,但它无法模拟真实市场的所有复杂性,如:订单簿深度、滑点、网络延迟、交易所 API 响应波动、突发新闻事件等。Dry-run(模拟交易)模式使用实时市场数据,以真实订单逻辑执行交易,但不实际下单。它能暴露回测中未发现的问题,如信号延迟、价格不匹配、频繁取消订单等。因此,即使回测表现优异,也必须经过 Dry-run 模式长时间(数周以上)验证,才能确认策略在实盘中具有可行性。回测是‘理论验证’,Dry-run 是‘实战演练’。