我的落地建议顺序 你可以按这个顺序做,最稳: 先加 mom5/mom10 预警 再加 rank_drop 预警 再加 peak_drawdown 退出 最后再决定是否加入资金流过滤器 前 3 步基本都属于低复杂度、低过拟合风险增强。 已思考 18s Quant System V210 Lowfreq Enhanced · python """ # ============================================================ # 十一、参数稳健性检查(避免过拟合) # ============================================================ def run_parameter_sanity_suite(data: Dict[str, Any]) -> pd.DataFrame: """ 不是做密集网格搜索,而是做小范围稳健性检查。 目标:验证改动方向是否稳,而不是找最佳点。 """ global REBALANCE_DAYS, MIN_HOLD_DAYS, HOLD_BUFFER_RANK, BUY_BUFFER_RANK configs = [ {"REBALANCE_DAYS": 8, "MIN_HOLD_DAYS": 4, "HOLD_BUFFER_RANK": 9, "BUY_BUFFER_RANK": 5}, {"REBALANCE_DAYS": 10, "MIN_HOLD_DAYS": 5, "HOLD_BUFFER_RANK": 10, "BUY_BUFFER_RANK": 6}, {"REBALANCE_DAYS": 12, "MIN_HOLD_DAYS": 6, "HOLD_BUFFER_RANK": 11, "BUY_BUFFER_RANK": 7}, ] old_values = (REBALANCE_DAYS, MIN_HOLD_DAYS, HOLD_BUFFER_RANK, BUY_BUFFER_RANK) rows = [] for cfg in configs: REBALANCE_DAYS = cfg["REBALANCE_DAYS"] MIN_HOLD_DAYS = cfg["MIN_HOLD_DAYS"] HOLD_BUFFER_RANK = cfg["HOLD_BUFFER_RANK"] BUY_BUFFER_RANK = cfg["BUY_BUFFER_RANK"] r = run_backtest(data, name=str(cfg)) rows.append({**cfg, "return": r["return"], "drawdown": r["drawdown"], "ret_dd": r["return"] / max(r["drawdown"], 1e-6)}) REBALANCE_DAYS, MIN_HOLD_DAYS, HOLD_BUFFER_RANK, BUY_BUFFER_RANK = old_values return pd.DataFrame(rows) # ============================================================ # 十二、主程序 # ============================================================ def main(): print("=" * 70) print("量化交易系统 v2.10 - 低频次日执行增强版") print("=" * 70) data = load_data(open_path=None) # 若有开盘价文件,传入 open_path='stock_open.csv' print(f"股票: {len(data['stocks'])}只, 交易日: {len(data['dates'])}天") result = run_backtest(data) trades_df = pd.DataFrame(result["trades"]) daily_df = pd.DataFrame(result["daily"]) if len(trades_df) > 0: trades_df.to_excel("回测v2.10-交易明细.xlsx", index=False) if len(daily_df) > 0: daily_df.to_excel("回测v2.10-每日详情.xlsx", index=False) print("\n✅ 回测完成") if __name__ == "__main__": main() 我已经按你刚才的诉求,把完整的 v2.10 低频增强版代码放到右侧代码文档里了,核心是基于你原来的四层架构重写,而不是另起炉灶。你原版确实是 Regime / Alpha / Portfolio / Execution 四层结构,主参数里有 REBALANCE_DAYS=20、HOLD_BUFFER_RANK=15、BUY_BUFFER_RANK=8、MIN_HOLD_DAYS=10,并且回测是“当日出信号、当日执行”,这些正是这次重点修正的地方。 这版架构我给你改成了下面这个思路: 1. RegimeEngine:大势层基本保留 继续负责市场评分、状态识别、仓位映射。 保留你原来“升级确认、降级确认、仓位日变动限制”的思路。 量化系统 v2.0 完整源码 2. AlphaEngine:选股层做了“提前识别增强” 保留 mom20 / mom60 / turnover / volatility 主骨架。 量化系统 v2.0 完整源码 新增 mom5 / mom10 / downside_vol / peak_drawdown 新增预警分 warn_score 新增“高位追涨抑制”,避免 mom20 和 mom60 都过热时的新开仓 3. PortfolioConstructor:组合层仍然简单 继续等权 / 牛市集中权重 不靠复杂优化器,尽量降低拟合风险 4. ExecutionEngine:这是改动最大的地方 显式加入 T+1 执行 支持 next_open / next_close 加入滑点、买卖费率 把执行拆成两段: 当天收盘后生成信号与订单 次日成交 加入日频个股风控,而不是只在调仓日处理 这版代码里最关键的新参数,我已经直接写进去了: EXECUTION_LAG_DAYS = 1 REBALANCE_DAYS = 10 MIN_HOLD_DAYS = 5 HOLD_BUFFER_RANK = 10 BUY_BUFFER_RANK = 6 MOM5_WARN = -2.0 MOM10_WARN = -4.0 PEAK_DD_WARN = 0.05 PEAK_DD_EXIT = 0.08 RANK_WARN = 10 RANK_EXIT = 15 RANK_DROP_WARN = 5 这些参数都故意保持圆整、少量、低自由度,目的就是让它更适合你这种低频实盘,同时尽量不走向过拟合。 另外我还加了一个很重要的模块: run_parameter_sanity_suite() 不是做密集网格搜索 只是做少量稳健性扰动检查 看策略是不是在一小圈参数变化下仍然稳定 这个比“找最优参数”更适合你现在的目标,因为你现在更关心的是: 提高收益 / 降低回撤 / 不要拟合。 你接下来最值得先做的,不是继续加因子,而是先用这版代码验证三件事: 改成 T+1 之后,历史收益和回撤变化多大 杰瑞股份这类“高位强趋势后转弱”的票,退出是否明显更早 参数在 8/10/12 天调仓、4/5/6 天最短持有下,表现是否保持稳定 下一步最合适的是你把这版先跑一遍,然后把: 总收益、最大回撤、交易次数、以及杰瑞股份那段交易明细 贴给我,我再帮你做第二轮“删不必要参数、保留有效预警”的精简。 来源 选择文件未选择任何文件选择文件未选择任何文件 ChatGPT 也可能会犯错。请核查重要信息。