feat: 三级趋势强化——大盘ADX≥20进_V40_BASE全家族继承,过滤MA20上但趋势弱的假牛市日(v9.2震荡年0笔/v8.1牛市100%全胜)
This commit is contained in:
+4
-1
@@ -84,7 +84,7 @@ STRATEGIES = {
|
|||||||
"dist_ma20_min": 4,
|
"dist_ma20_min": 4,
|
||||||
"vol_ratio_min": 1.2, "vol_ratio_max": 1.5,
|
"vol_ratio_min": 1.2, "vol_ratio_max": 1.5,
|
||||||
"ma20_slope_max": 1.5,
|
"ma20_slope_max": 1.5,
|
||||||
"mkt_above_ma20": True, "mkt_slope_max": -0.05,
|
"mkt_above_ma20": True, "mkt_slope_max": -0.05, "mkt_adx_min": 20,
|
||||||
"hh_only": True}},
|
"hh_only": True}},
|
||||||
"exit": {"tp_pct": 0.15, "sl_atr": 1.5, "max_hold_days": 20},
|
"exit": {"tp_pct": 0.15, "sl_atr": 1.5, "max_hold_days": 20},
|
||||||
"sizing": {"kelly": True, "kelly_fraction": 0.5},
|
"sizing": {"kelly": True, "kelly_fraction": 0.5},
|
||||||
@@ -380,6 +380,7 @@ def _load_index_ctx(index_code, start_date, end_date):
|
|||||||
'above_ma20': (b.get('close') or 0) > ma20 if ma20 > 0 else None,
|
'above_ma20': (b.get('close') or 0) > ma20 if ma20 > 0 else None,
|
||||||
'ma20_slope': slope,
|
'ma20_slope': slope,
|
||||||
'roc': b.get('roc'),
|
'roc': b.get('roc'),
|
||||||
|
'adx': b.get('adx'), # 趋势强度(choppy市<20,趋势市>25,2026-07-30强化趋势过滤)
|
||||||
}
|
}
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
@@ -594,6 +595,7 @@ def pass_filters(factors, filters):
|
|||||||
# 大盘
|
# 大盘
|
||||||
if filters.get('mkt_above_ma20') and factors.get('mkt_above_ma20') is not True: return False
|
if filters.get('mkt_above_ma20') and factors.get('mkt_above_ma20') is not True: return False
|
||||||
if not chk('mkt_slope', filters.get('mkt_slope_min'), filters.get('mkt_slope_max')): return False
|
if not chk('mkt_slope', filters.get('mkt_slope_min'), filters.get('mkt_slope_max')): return False
|
||||||
|
if not chk('mkt_adx', filters.get('mkt_adx_min'), filters.get('mkt_adx_max')): return False
|
||||||
# 行业
|
# 行业
|
||||||
if not chk('sector_change', filters.get('sector_change_min'), filters.get('sector_change_max')): return False
|
if not chk('sector_change', filters.get('sector_change_min'), filters.get('sector_change_max')): return False
|
||||||
if not chk('sector_rank_pct', None, filters.get('sector_rank_pct_max')): return False
|
if not chk('sector_rank_pct', None, filters.get('sector_rank_pct_max')): return False
|
||||||
@@ -741,6 +743,7 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T
|
|||||||
factors['mkt_above_ma20'] = mk.get('above_ma20')
|
factors['mkt_above_ma20'] = mk.get('above_ma20')
|
||||||
factors['mkt_slope'] = mk.get('ma20_slope')
|
factors['mkt_slope'] = mk.get('ma20_slope')
|
||||||
factors['mkt_roc'] = mk.get('roc')
|
factors['mkt_roc'] = mk.get('roc')
|
||||||
|
factors['mkt_adx'] = mk.get('adx')
|
||||||
factors['sector_change'] = sc_ctx.get('change')
|
factors['sector_change'] = sc_ctx.get('change')
|
||||||
factors['sector_rank_pct'] = sc_ctx.get('rank_pct')
|
factors['sector_rank_pct'] = sc_ctx.get('rank_pct')
|
||||||
factors['sector_inflow'] = sc_ctx.get('inflow')
|
factors['sector_inflow'] = sc_ctx.get('inflow')
|
||||||
|
|||||||
Reference in New Issue
Block a user