Files

230 lines
6.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""策略参数寻优预设网格。
每个内置策略 1-2 个关键参数的合理取值列表,供:
1. Web UI 参数寻优页(``ParamGridPicker``)切换策略时自动填充——用户开箱即用,
仍可编辑/取消勾选。
2. 「一键寻优所有策略」(``/backtest/optimize-all/run/async``)逐策略做网格
寻优再全局排名。
约束:单策略笛卡尔积 ≤ 200``ParamGridOptimizer.MAX_GRID_POINTS``)。行尾注释
标注该策略的网格点数。修改本文件即同步生效,无需重启策略注册表。
新增策略时:在 :data:`STRATEGY_PRESETS` 增加同名 key 即可;未登记的策略在
「一键寻优」中会被跳过并记录 warning。
"""
from __future__ import annotations
from typing import Any
# 策略名 → {参数名: 取值列表}
STRATEGY_PRESETS: dict[str, dict[str, list[Any]]] = {
# ── 均线类 ──────────────────────────────────────────────────────────────
"ma_cross": {
# 快线 < 慢线才有意义;笛卡尔积去重快≥慢的无效组合后约 30+
"fast": [5, 10, 15, 20, 30, 60],
"slow": [10, 20, 30, 60, 120, 250],
}, # 36
"ema_cross": {
"fast": [5, 10, 12, 20],
"slow": [20, 26, 30, 60],
}, # 16
"triple_ma": {
"short": [5, 10, 15],
"long": [60, 120, 250],
}, # 9mid 用默认 20
"bbi": {
"m1": [3, 6],
"m4": [20, 30, 50],
}, # 6
# ── 通道/突破类 ─────────────────────────────────────────────────────────
"boll_breakout": {
"n": [10, 15, 20, 30],
"p": [1.5, 2.0, 2.5, 3.0],
}, # 16
"donchian": {
"n": [10, 15, 20, 30, 40, 55],
}, # 6
"keltner": {
"n": [10, 15, 20, 30],
"m": [7, 10, 14, 20],
}, # 16
"atr_breakout": {
"n_ma": [10, 20],
"k": [1.5, 2.0, 2.5, 3.0],
}, # 8
# ── 振荡/反转类 ─────────────────────────────────────────────────────────
"macd": {
"short": [8, 10, 12, 15],
"long": [20, 26, 30, 40],
}, # 16
"rsi_reversal": {
"n": [7, 14, 21],
"oversold": [20, 25, 30],
}, # 9
"kdj_cross": {
"n": [5, 9, 14, 18, 21],
}, # 5
"cci": {
"n": [14, 20],
"oversold": [-150, -100, -50],
}, # 6
"wr_reversal": {
"n": [7, 14],
"oversold": [-90, -80, -70],
}, # 6
"bias_reversal": {
"n": [6, 12],
"threshold": [3.0, 5.0, 7.0, 10.0],
}, # 8
# ── 趋向/平滑类 ─────────────────────────────────────────────────────────
"dmi": {
"m1": [14, 20],
"m2": [6, 10, 14],
}, # 6
"trix": {
"m1": [12, 18],
"m2": [12, 20, 30],
}, # 6
"emv": {
"n": [10, 14, 20, 28],
}, # 4
"dpo": {
"m1": [15, 20, 30],
}, # 3
# ── 分水岭类 ─────────────────────────────────────────────────────────────
"fsl": {
# capital 仅作粗档扫描(1千万/1亿/10亿股),覆盖小盘→大盘
"capital": [1e7, 1e8, 1e9, 1e10],
}, # 4
# ── V1.30.2 存量指标补齐 ────────────────────────────────────────────────
"psy_reversal": {
"n": [12, 20],
"oversold": [20, 25, 30],
}, # 6
"mtm_cross": {
"n": [6, 12, 24],
}, # 3
"roc_zero": {
"n": [6, 12, 24],
}, # 3
"expma_cross": {
"n1": [5, 10, 12],
"n2": [26, 50, 60],
}, # 9n1<n2 全部有效)
"dfma_cross": {
"n1": [5, 10],
"n2": [30, 50],
}, # 4
"cr_reversal": {
"n": [20, 26],
"oversold": [30, 40],
}, # 4
"xsii_breakout": {
"n": [80, 102, 120],
}, # 3
"obv_cross": {
"m": [10, 20, 30, 60],
}, # 4
"vr_reversal": {
"m1": [20, 26],
"oversold": [40, 50],
}, # 4
"mass_cross": {
"n2": [20, 25, 30],
}, # 3n1 用默认 9
"mfi_reversal": {
"n": [14, 20],
"oversold": [15, 20],
}, # 4
"brar_reversal": {
"m1": [26],
"oversold": [30, 40, 50],
}, # 3
"asi_cross": {
"m2": [7, 10, 14],
}, # 3m1 用默认 26
"zhuoyao_trend": {
"n2": [40, 60, 90],
"n3": [10, 20],
}, # 6n3<n2 全部有效)
"bias_signal_cross": {
"p": [5, 10],
"m": [20, 30, 60],
}, # 6
"sar_follow": {
"af_step": [0.01, 0.02, 0.03],
}, # 3
"vwap_cross": {
"n": [10, 20, 30],
}, # 3
"aroon_cross": {
"n": [14, 21, 25],
}, # 3
"fk_reversal": {}, # 无参数策略:单点(默认参数)
# ── V1.30.2 新指标首发 ──────────────────────────────────────────────────
"supertrend": {
"n": [7, 10, 14],
"m": [2.0, 3.0, 4.0],
}, # 9
"kama_cross": {
"n": [10, 20, 30],
}, # 3fast/slow 用默认 2/30
"hma_cross": {
"fast": [10, 16],
"slow": [30, 50],
}, # 4
"chandelier": {
"n": [15, 22, 30],
"k": [2.5, 3.0],
}, # 6m 用默认 22
"ichimoku_cross": {
"p1": [9, 20],
"p2": [26, 40],
}, # 4p1<p2<p3=52 全部有效)
"uos_reversal": {
"oversold": [25, 30, 35],
}, # 3(周期用默认 7/14/28
"cmo_reversal": {
"n": [14, 20],
"threshold": [40.0, 50.0, 60.0],
}, # 6
"tsi_cross": {
"r": [13, 25],
"m": [7, 13],
}, # 4s 用默认 13
"fisher_cross": {
"n": [5, 9, 13],
}, # 3
"squeeze_breakout": {
"kc": [1.2, 1.5, 2.0],
}, # 3n=20/bb=2.0 用默认)
"chop_trend": {
"n_ma": [20, 30],
"trend_th": [35.0, 38.2],
}, # 4
"ad_cross": {
"m": [10, 20, 30, 60],
}, # 4
"cmf_zero": {
"n": [14, 20, 30],
}, # 3
"efi_zero": {
"n": [10, 13, 20],
}, # 3
"bbp_reversal": {
"n": [10, 20],
"p": [1.5, 2.0],
}, # 4
"bbw_squeeze": {
"n": [20, 30],
"n_ma": [20, 30],
}, # 4
}
def get_preset(strategy_name: str) -> dict[str, list[Any]]:
"""返回某策略的预设网格;未登记返回空 dict。"""
return STRATEGY_PRESETS.get(strategy_name, {})