feat: 策略实验室多版本体系 — v1~v4.1迭代+12维上下文(大盘/趋势变化)+因子归因+版本对比列表

This commit is contained in:
hmo
2026-07-28 23:57:23 +08:00
parent 62305cb062
commit 3acbd6f4fd
3 changed files with 822 additions and 84 deletions
+56 -18
View File
@@ -533,28 +533,66 @@ def get_tracking():
@app.route("/api/research/backtest")
def get_research_backtest():
import sqlite3
from datetime import datetime, timedelta
period = request.args.get("period", "1y")
capital = float(request.args.get("capital", 1000000))
end_date = datetime.now().strftime("%Y-%m-%d")
if period == "6m":
start_date = (datetime.now() - timedelta(days=180)).strftime('%Y-%m-%d')
elif period == "1y":
start_date = (datetime.now() - timedelta(days=365)).strftime('%Y-%m-%d')
else:
start_date = (datetime.now() - timedelta(days=730)).strftime('%Y-%m-%d')
@app.route("/api/research/strategies")
def api_research_strategies():
"""策略版本列表(含回测结果摘要)"""
try:
from backtest_framework import run_strategy_research
result = run_strategy_research(start_date, end_date, capital)
from flask import jsonify
return jsonify(result)
from strategy_lab import list_strategies
return jsonify({'strategies': list_strategies()})
except Exception as e:
from flask import jsonify
return jsonify({'error': str(e)}), 500
@app.route("/api/research/backtest")
def api_research_backtest():
"""运行指定策略版本的回测"""
from datetime import datetime, timedelta
version = request.args.get('strategy', 'v4.1')
period = request.args.get('period', '6m')
capital = float(request.args.get('capital', 1000000))
end_date = '2026-07-24' # 数据完整截止日
days = {'1m': 30, '6m': 185, '1y': 365, '2y': 730}.get(period, 185)
start_date = (datetime.strptime(end_date, '%Y-%m-%d') - timedelta(days=days)).strftime('%Y-%m-%d')
try:
from strategy_lab import run_backtest, analyze_trade_list, save_analysis
result = run_backtest(version, start_date, end_date, capital)
analysis = analyze_trade_list(result.get('trades', []), version)
save_analysis(version, analysis)
result['insights'] = analysis.get('insights', [])
return jsonify(result)
except ValueError as e:
return jsonify({'error': str(e)}), 404
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route("/api/research/analysis")
def api_research_analysis():
"""指定策略版本的因子归因分析"""
version = request.args.get('strategy', 'v4.1')
try:
from strategy_lab import analyze_trades
return jsonify(analyze_trades(version))
except Exception as e:
return jsonify({'error': str(e)}), 500
@app.route("/api/research/trades")
def api_research_trades():
"""指定策略版本的交易明细"""
import sqlite3 as _sq, json as _json
version = request.args.get('strategy', 'v4.1')
conn = _sq.connect("/home/hmo/MoFin/data/mofin.db")
row = conn.execute(
"SELECT results_json FROM strategy_research WHERE version=? ORDER BY id DESC LIMIT 1",
(version,)).fetchone()
conn.close()
if not row:
return jsonify({'error': f'{version} 回测结果'}), 404
res = _json.loads(row[0])
return jsonify({'strategy': version, 'trades': res.get('trades', [])})
@app.route("/api/overview")
def api_overview():
"""概览数据"""