优化命令行输出效果
This commit is contained in:
93
backtest.py
93
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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user