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