1
0

优化命令行输出效果

This commit is contained in:
2026-01-27 22:25:22 +08:00
parent d8159af1d2
commit 407b70bd0e

View File

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