- 配置中取消固定end_date,改为默认使用当前日期 - 添加打印最新调仓信号的功能,显示持仓明细及调出品种 - 在报告生成流程中调用最新调仓信号打印函数 - 图表展示中新增最新调仓信号表格,支持颜色区分调入、调出和维持 - 优化报告图表布局,调整画布高度适应信号表内容 - 删除无用test.py测试脚本及相关冗余代码
115 lines
3.0 KiB
Python
Executable File
115 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
"""
|
||
ETF轮动策略回测入口
|
||
|
||
用法:
|
||
python scripts/run_rotation.py
|
||
python scripts/run_rotation.py --config config/strategies/rotation.yaml
|
||
"""
|
||
|
||
import sys
|
||
import time
|
||
import yaml
|
||
import argparse
|
||
from pathlib import Path
|
||
|
||
# 添加项目根目录到路径
|
||
project_root = Path(__file__).parent.parent
|
||
sys.path.insert(0, str(project_root))
|
||
|
||
from strategies.rotation.engine import RotationStrategy
|
||
from strategies.rotation.portfolio import track_positions, save_trades
|
||
from strategies.rotation.report import generate_performance_report
|
||
from config.settings import CODE_NAME_MAP, BENCHMARK_NAME
|
||
|
||
|
||
def load_config(config_path: str) -> dict:
|
||
"""加载配置文件"""
|
||
with open(config_path, "r", encoding="utf-8") as f:
|
||
return yaml.safe_load(f)
|
||
|
||
|
||
def main():
|
||
parser = argparse.ArgumentParser(description="ETF轮动策略回测")
|
||
parser.add_argument(
|
||
"--config",
|
||
type=str,
|
||
default="config/strategies/rotation.yaml",
|
||
help="配置文件路径",
|
||
)
|
||
parser.add_argument(
|
||
"--save-path",
|
||
type=str,
|
||
default="results/report",
|
||
help="报告保存路径前缀",
|
||
)
|
||
args = parser.parse_args()
|
||
|
||
start_time = time.time()
|
||
|
||
print("=" * 60)
|
||
print(" ETF轮动策略 回测系统")
|
||
print("=" * 60)
|
||
|
||
# 加载配置
|
||
config = load_config(args.config)
|
||
|
||
# 如果未设置 end_date,默认使用最新日期
|
||
if not config.get('end_date'):
|
||
from datetime import datetime
|
||
config['end_date'] = datetime.now().strftime('%Y-%m-%d')
|
||
|
||
print(f"\n配置文件: {args.config}")
|
||
print(f"候选标的: {len(config['code_list'])} 只")
|
||
print(f"回测区间: {config['start_date']} ~ {config['end_date']}")
|
||
print(f"因子类型: {config['factor_type']}")
|
||
print(f"窗口天数: {config['n_days']}")
|
||
print(f"选中数量: {config['select_num']}")
|
||
print(f"调仓周期: {config['rebalance_days']} 天")
|
||
print(f"交易成本: {config['trade_cost']:.2%}")
|
||
|
||
# 创建策略实例
|
||
strategy = RotationStrategy(config)
|
||
|
||
# 运行回测
|
||
print("\n" + "=" * 60)
|
||
print("开始回测...")
|
||
print("=" * 60)
|
||
|
||
backtest_result = strategy.run()
|
||
|
||
# 持仓跟踪
|
||
print("\n" + "=" * 60)
|
||
print("持仓跟踪...")
|
||
print("=" * 60)
|
||
|
||
trades_df, summary_df = track_positions(
|
||
backtest_result,
|
||
code_name_map=CODE_NAME_MAP,
|
||
select_num=config["select_num"],
|
||
)
|
||
save_trades(trades_df, summary_df, save_path=args.save_path)
|
||
|
||
# 生成绩效报告
|
||
print("\n" + "=" * 60)
|
||
print("生成绩效报告...")
|
||
print("=" * 60)
|
||
|
||
metrics = generate_performance_report(
|
||
backtest_result,
|
||
strategy.valid_codes,
|
||
code_name_map=CODE_NAME_MAP,
|
||
benchmark_name=BENCHMARK_NAME,
|
||
save_path=args.save_path,
|
||
select_num=config["select_num"],
|
||
)
|
||
|
||
elapsed = time.time() - start_time
|
||
print(f"\n总耗时: {elapsed:.1f}秒")
|
||
|
||
return metrics
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|