diff --git a/backtest.py b/backtest.py index c1bdc9e..3bc850b 100644 --- a/backtest.py +++ b/backtest.py @@ -210,51 +210,54 @@ def print_stats(stats): print("回测结果") print("=" * 60) - # 基本指标 - metrics = [ - ("Return (%)", "总收益率", "Return [%]"), - ("Return", "总收益", "Return"), - ("Sharpe Ratio", "夏普比率", "Sharpe Ratio"), - ("Sortino Ratio", "索提诺比率", "Sortino Ratio"), - ("Calmar Ratio", "卡尔玛比率", "Calmar Ratio"), - ("Max Drawdown (%)", "最大回撤 (%)", "Max. Drawdown [%]"), - ("Avg Drawdown (%)", "平均回撤 (%)", "Avg. Drawdown [%]"), - ("Max Drawdown Duration", "最大回撤持续天数", "Max. Drawdown Duration"), - ("Avg Drawdown Duration", "平均回撤持续天数", "Avg. Drawdown Duration"), - ] - - for key, cn_name, en_name in metrics: - try: - value = getattr(stats, key, None) - if value is not None: - formatted = format_value(value, cn_name, key) - print(f"{cn_name:20s}: {formatted}") - except Exception: - pass - - print() - - # 交易统计 - trade_metrics = [ - ("# Trades", "总交易次数", "# Trades"), - ("Win Rate [%]", "胜率 (%)", "Win Rate [%]"), - ("Best Trade", "最佳交易", "Best Trade"), - ("Worst Trade", "最差交易", "Worst Trade"), - ("Avg Trade", "平均交易", "Avg. Trade"), - ("Avg Win Trade", "平均盈利交易", "Avg. Win Trade"), - ("Avg Loss Trade", "平均亏损交易", "Avg. Loss Trade"), - ("Profit Factor", "盈利因子", "Profit Factor"), - ("Expectancy", "期望值", "Expectancy"), - ] - - for key, cn_name, en_name in trade_metrics: - try: - value = getattr(stats, key, None) - if value is not None: - formatted = format_value(value, cn_name, key) - print(f"{cn_name:20s}: {formatted}") - except Exception: - pass + indicator_name_mapping = { + # 'Start': '回测开始时间', + # 'End': '回测结束时间', + # 'Duration': '回测持续时长', + # 'Exposure Time [%]': '持仓时间占比(%)', + 'Equity Final [$]': '最终收益', + 'Equity Peak [$]': '峰值收益', + 'Return [%]': '总收益率(%)', + 'Buy & Hold Return [%]': '买入并持有收益率(%)', + 'Return (Ann.) [%]': '年化收益率(%)', + 'Volatility (Ann.) [%]': '年化波动率(%)', + # 'CAGR [%]': '复合年均增长率(%)', + # 'Sharpe Ratio': '夏普比率', + 'Sortino Ratio': '索提诺比率', + 'Calmar Ratio': '卡尔玛比率', + # 'Alpha [%]': '阿尔法系数(%)', + # 'Beta': '贝塔系数', + 'Max. Drawdown [%]': '最大回撤(%)', + 'Avg. Drawdown [%]': '平均回撤(%)', + 'Max. Drawdown Duration': '最大回撤持续时长', + 'Avg. Drawdown Duration': '平均回撤持续时长', + '# Trades': '总交易次数', + 'Win Rate [%]': '胜率(%)', + # 'Best Trade [%]': '最佳单笔交易收益率(%)', + # 'Worst Trade [%]': '最差单笔交易收益率(%)', + # 'Avg. Trade [%]': '平均单笔交易收益率(%)', + # 'Max. Trade Duration': '单笔交易最长持有时长', + # 'Avg. Trade Duration': '单笔交易平均持有时长', + # 'Profit Factor': '盈利因子', + # 'Expectancy [%]': '期望收益(%)', + 'SQN': '系统质量数', + # 'Kelly Criterion': '凯利准则', + } + for k, v in stats.items(): + if k in indicator_name_mapping: + cn_name = indicator_name_mapping.get(k, k) + if isinstance(v, (int, float)): + if "%" in cn_name or k in ['Sharpe Ratio', 'Sortino Ratio', 'Calmar Ratio', 'Profit Factor']: + formatted_value = f"{v:.2f}" + elif "$" in cn_name: + formatted_value = f"{v:.2f}" + elif "次数" in cn_name: + formatted_value = f"{v:.0f}" + else: + formatted_value = f"{v:.4f}" + else: + formatted_value = str(v) + print(f'{cn_name}: {formatted_value}') print("=" * 60 + "\n")