简介:这是一份面向量化投资与金融工程研究者的A股多维度择时系统专题报告,基于经济运行、流动性、动量趋势与事件驱动四大维度构建综合打分模型,用于解决权益资产择时与回撤控制问题。资源为单份PDF文件,共1.06MB,即华宝证券15页正式研报,适合在资产配置框架下学习量化择时体系的完整搭建方法。该资源已有102人学习,属于金融工程方向中结构完整的策略构建实例。报告先对单指标进行择时测试,依据收益与胜率加权合成各维度打分,再综合四大维度形成主交易系统与事件驱动加分项,并测试不同权重合成方法,发现等权策略收益更稳定。回测区间为2012年1月至2019年6月,该系统的年化收益12.8%,跑赢同期沪深300的6.8%,滚动一年平均最大回撤由-22.2%显著收窄至-9.6%,Calmar比率达1.33;同时报告提示模型设定偏差风险,并列有相关研究报告,可帮助读者深入理解多因子择时的实证流程与评估指标。
1. 从“看对方向”到“做对节奏”:A股多维度量化择时到底在解决什么问题
过去两年A股有两段像样的指数行情,都出现“方向看对、账户没赚”的现象:指数反弹十几个点,仓位却在底部震荡里被止损打光,启动时只剩三成仓。问题不在多空判断,而在节奏——当前该配几成仓。A股多维度量化择时,就是要把技术面、资金面、情绪面这几类互不隶属的信号,合成一个可执行的仓位建议,再用回测确认它比凭感觉加减仓更稳。金融工程团队最常见的落地形态,是定期给出一份择时专题报告:多维因子打分,输出 0 到 100 的择时分数,再映射成仓位。这篇笔记把构建与回测的完整链路拆开,适合做指数增强、ETF 轮动,以及想从主观判断转向系统化决策的从业者。
2. 多维度择时先选因子:从价格、资金到情绪的维度怎么搭
构建择时系统第一步不是写代码,而是定义信息源。所谓“多维”,不是说把三个均线指标叠在一起就算多维——它们背后是同一个价格动量逻辑,本质还是一个维度。真正有效的多维,需要覆盖价格、资金、情绪这三个互不隶属的信息源,条件允许时再补宏观和基本面。以下按我实际搭建因子池的顺序展开,每个维度给原理、给代码、给参数边界。
2.1 技术面维度:趋势过滤、动量加速与波动率状态怎么组合
技术面是择时的地基,逻辑基础是趋势跟踪:A 股指数层面的趋势一旦形成,短期内很难反转,均线多头排列往往能持续数周甚至数月。技术面内部我建议拆成三层,而不是只用一个均线指标。
第一层是趋势过滤,用收盘价与 20 日、60 日均线的关系判断方向。第二层是动量加速,用短周期动量减去长周期动量,衡量趋势是正在加强还是衰减。第三层是波动率状态,用 20 日年化波动率的排名来刻画市场环境,低波动状态下趋势更容易延续,高波动往往对应顶部区域的剧烈分歧。
import pandas as pd import numpy as np def tech_factors(df, ma_short=20, ma_long=60, mom_short=20, mom_long=120): df = df.copy() # 趋势过滤:收盘价在短均线和长均线之上记 1 分,多头发散才给分 df['ma_s'] = df['close'].rolling(ma_short).mean() df['ma_l'] = df['close'].rolling(ma_long).mean() df['trend'] = ((df['close'] > df['ma_s']) & (df['ma_s'] > df['ma_l'])).astype(int) # 动量加速:20日收益减去120日收益,衡量趋势在加速还是减速 df['mom'] = df['close'].pct_change(mom_short) - df['close'].pct_change(mom_long) # 波动率倒数排名:低波动给高分,注意用 rank 而非原始值 df['vol'] = df['close'].pct_change().rolling(20).std() * np.sqrt(252) df['vol_score'] = (-df['vol']).rank(pct=True) return dftrend 是 0/1 的硬过滤,避免在均线纠缠期反复给信号;mom 的正负和大小代表趋势动能,做的是“加速度”而不是“速度”;vol_score 用滚动排名而不是标准差的倒数,是防止极端波动日把整个因子序列拉偏。周期参数上,20/60 是日线择时的基准配置,做周线或月线时把参数同步放大 4 倍或 20 倍;mom 的 120 日窗口近似半年的比较基准,代表“过去一个月相对过去半年的强弱”。技术面这三层合成后,能覆盖趋势跟踪的大部分场景,但它在震荡市里会频繁出错,所以需要资金面和情绪面来补充。
2.2 资金面维度:用成交额、换手与主力净流入替代“北向”
资金面是券商择时报告里最常放的一层,但这里有一个数据可得性的现实问题:北向资金的盘中实时数据近几年披露口径调整后不再可靠,做系统只能拿到频率更低的数据。所以实践中我一般用三类替代信号,而不是硬等北向数据。
第一类是量能倍数,当日成交额除以 20 日均值,衡量放量还是缩量。A 股是资金驱动型市场,放量上涨比缩量上涨可信得多。第二类是换手率分位数,全市场换手率近两年的分位,刻画人气的“温度计”而不是绝对水平。第三类是主力净流入,但该数据依赖个股资金流模型估算,在不同行情下的稳定性较差,我通常只把它当辅助项,不参与主打分。
def mkt_factors(df, ma_vol=20, window=500): df = df.copy() # 量能倍数:当日成交额相对20日均值的倍数 df['vol_ratio'] = df['amount'] / df['amount'].rolling(ma_vol).mean() # 换手率分位数:滚动window日内的分位,接近1表示人气过热 df['turn_rank'] = df['turnover'].rolling(window).apply( lambda x: (x[-1] >= x).mean(), raw=True) return dfvol_ratio 大于 1.5 且配合价格上涨,才被认为是有效放量;如果放量但价格滞涨,反而是派发信号,这个要结合 2.1 的趋势过滤一起看。turn_rank 接近 1 说明换手过热,在 A 股里通常是短期顶部区域,实践中作为反向信号处理,即分数越高,资金面得分越低。注意 rolling(window) 需要至少 500 个交易日的数据,如果用周线,将 window 调到 100;数据不足时用 expanding 替代,否则因子序列前段全是 NaN,回测起始日会被迫后移。资金面的核心价值在于和技术面互补:技术面趋势向上但资金面持续背离时,往往是行情尾声。
2.3 情绪面维度:上涨家数、涨停效应与融资余额的顶底含义
情绪面反映的是市场参与者的风险偏好,代表从众行为对价格的额外推动力。常用的三个情绪指标各有各的观察角度:全市场上涨家数占比,看的是市场内部的赚钱广度;涨停家数,看的是短线资金的活跃度;融资余额的 20 日变化率,看的是杠杆资金的风险偏好。
上涨家数占比有一个很经典的用法:指数创了新高,但上涨家数占比连续走低,这是顶背离;反过来,指数没创新低,但上涨家数占比先企稳回升,往往是反弹启动的早期信号。涨停家数从冰点(比如全市场不到 20 家涨停)快速上升到活跃(50 家以上),意味着赚钱效应回归,资金愿意承担风险。
def sentiment_factors(breath, limit_up, margin, window=20): # breath: 全市场上涨家数占比序列 # limit_up: 每日涨停家数 # margin: 融资余额序列 df = pd.DataFrame({ 'breath': breath, 'limit_up': limit_up, 'margin': margin }) df['breath_ma'] = df['breath'].rolling(window).mean() # 涨停家数的滚动标准差:过冷过渡到活跃时,std明显放大 df['limit_std'] = df['limit_up'].rolling(window).std() df['margin_chg'] = df['margin'].pct_change(window) return dfbreath_ma 用的是平滑后的占比,平滑窗口取 20 日能滤掉单日噪音;limit_std 用标准差而非绝对值,是因为不同年份的涨停总数不一样,绝对阈值会失效;margin_chg 是融资余额的 20 日变化率,增速过快说明杠杆资金过热,容易触发去杠杆回调,通常也做反向处理。三个维度都算完后,需要做一次相关性筛查:跨维度相关性超过 0.7 的因子通常二选一,同维度内可以容忍更高冗余。某次构建中我曾把技术面的动量加速和情绪面的涨停标准差放一起,两者 20 日滚动相关接近 0.6,最终给情绪面降了权重,因为短线活跃度本身就是由价格波动催生的。
3. 因子合成与阈值标定:怎么把多组信号变成一个仓位
因子选完后就要回答一个核心问题:这些 0 到 1 之间的因子值,怎么合并成一个 0 到 100 的择时分数?合并方式直接决定策略的稳健性,步骤拆成三部分:因子标准化、权重设定、阈值与仓位映射。每一步的坑都不少,分别展开。
3.1 因子标准化:滚动分位数为什么比 z-score 稳
A 股因子的分布并不是稳定的正态分布,尤其是换手率、波动率这类带尖峰厚尾的序列,一个极端值就能把 z-score 打得面目全非。滚动分位数把所有因子统一映射到 0 到 1 之间,天然对极端值平滑,而且它反映的是“当前值在历史上处于什么位置”,这才是择时真正需要的信息。
def rank_std(factor, window=500): # 滚动分位数标准化,返回值越接近1表示因子当前越强 return factor.rolling(window).apply( lambda x: (x[-1] >= x).mean(), raw=True)window 取 500 个交易日,大约覆盖两年市场状态。太短的话标准化本身会变成噪声,比如 60 日窗口在单边下跌后会认定“当前很低”,但放在两年的尺度里可能只是半山腰。数据不足 500 日的部分建议直接留空,不要用 expanding 替代后硬填,因为早期样本的市场结构可能和现在差异巨大。完成标准化后,所有因子都在同一量纲上,不再需要手动调权重来平衡量纲差异,这是滚动分位数相比 z-score 的实际收益。
另一种常见的标准化是 z-score,它假设因子服从正态分布,但 2.2 里的换手率分位数在牛市和熊市里的分布形态完全不同,用 z-score 会把“过热”和“异常”混为一谈。滚动分位数牺牲了数值的绝对含义,换来了跨周期的稳健性,这个交换在择时场景里是值得的。
3.2 权重设定:ICIR 加权有效,但别让它吃掉稳健性
权重设定有两条路线:等权是基本盘,ICIR 加权是进阶选择。等权的价值容易被低估——它没有需要拟合的参数,不存在样本内过拟合问题,报告里的复现结果也最接近原始逻辑。我一般先把所有因子等权合成一份基准结果,再尝试用 ICIR 加权看能否在基准之上改善。
ICIR 加权的思路是:给“历史上预测能力强且稳定”的因子更高权重。具体做法是滚动计算每个因子与未来 5 日收益的秩相关,得到 IC 序列,再用 IC 的均值除以标准差作为权重。IC 均值衡量预测能力,IC 标准差衡量稳定性。
def icir_weights(factors, ret_fwd, window=60): # factors: 标准化后的因子DataFrame, ret_fwd: 未来5日收益 # 滚动计算每个因子的spearman相关 ic = factors.rolling(window).corr(ret_fwd) # 权重 = IC均值 / IC标准差,负相关因子直接置0 w = ic.mean() / ic.std() w[w < 0] = 0 # 归一化,和为1 return w / w.sum()这里的 corr 默认算的是 pearson,但择时场景建议用 spearman,因为因子打分只关心序次而非线性关系,秩相关对极端值更稳健。使用中两个参数需要盯住:window 取 60 日,约一个季度,太短权重会逐月剧烈跳动;还要注意权重不可能为负不现实,所以我直接置 0。
实践里 ICIR 加权大部分时候跑赢等权的幅度有限,但引入了至少两个额外参数,过拟合风险翻倍。我的习惯是先跑等权基准,再算 ICIR 权重,两者差异超过 3 个百分点的年化收益时,要回头怀疑 ICIR 是在拟合噪声,而不是发现了真实规律。还有一种折中的“约束型等权”,比如资金面整体权重不超过三成、情绪面不超过两成,其余给技术面。这是报告里最常出现的权重结构,原因很简单:技术面在趋势行情中的贡献最大,给它更高权重是符合 A 股交易逻辑的先验判断,而不是数据挖出来的。
3.3 阈值标定与仓位映射:缓冲带是减少磨损的关键
合成分数就是权重乘以各因子标准化值再求和,放大到 0 到 100。但这里不能直接把分数线性映射到仓位——如果分数在 50 附近来回穿越,线性映射会导致每周都调仓,交易磨损会把收益吃光,这恰恰是多数向量化回测里看不到的坑。
常见做法是设上下阈值:分数高于 65 加到目标满仓,低于 35 减到下限仓位,35 到 65 之间保持原有仓位不做调整。这个中间带就是缓冲带,它的宽度直接决定了年化换手率。
def zs_to_pos(score, hi=65, lo=35, pos_hi=1.0, pos_lo=0.0, prev_pos=0.5): # 分数超过上阈值:加仓到目标高仓位 if score >= hi: return pos_hi # 分数跌破下阈值:减仓到目标低仓位 if score <= lo: return pos_lo # 中间带:维持原仓位,避免小波动触发频繁调仓 return prev_pos # 回测中的调用方式(示意): # for t in range(1, len(score)): # pos[t] = zs_to_pos(score[t], 65, 35, 1.0, 0.0, pos[t-1])缓冲带参数 65/35 是经验起点,不代表最优。回测里应该对 hi 和 lo 做网格搜索,步长 5 分,搜索范围 hi 取 55 到 75,lo 取 25 到 45。确定阈值时必须用样本前 70% 做训练,后 30% 做验证,绝不能在全样本上反复挑阈值,否则选出来的就是一组只对这段历史有效的参数。实盘中还要再加一个约束:只有当目标仓位与当前仓位之差超过 10 个百分点时才执行调仓,进一步压降换手。仓位区间 pos_hi 和 pos_lo 也不是只能取 1 和 0,保守型可以设成 0.8 和 0.2,这个区间本身也是一种风险预算。
4. 回测框架与验证指标:别让“完美曲线”骗了你
回测框架的选择直接决定结果可信度。择时系统的底层标的是指数或 ETF,每天只有一个净值序列,调仓动作只有加仓和减仓,比多因子选股简单得多,但如果框架里的成本、滑点和未来函数处理不到位,回测依然会失真。
4.1 回测引擎选择:向量化回测对择时系统已经够用
回测引擎有向量化和事件驱动两条路线。多因子选股必须处理个股停牌、涨跌停买不进、调仓权重分配,事件驱动模拟更贴近实盘;但择时系统交易标的是指数或 ETF,每天一个净值,调仓只有两个方向,向量化完全够用。向量化的核心思想是:把仓位序列当作一个向量,与下一日收益逐元素相乘,得到策略收益序列。
事件驱动也不是没有优点,它能自然处理涨跌停无法成交、停牌无法交易这些细节,但代价是慢和代码复杂度高。对于择时这个场景,用向量化加上严格的信号延迟处理,已经能达到与事件驱动接近的精度。
def vectorized_backtest(price, score, hi=65, lo=35): # 用t日收盘后的score生成t+1日的目标仓位,避免未来函数 pos = pd.Series(np.nan, index=price.index) pos.iloc[0] = 0.0 for t in range(1, len(price)): pos.iloc[t] = zs_to_pos(score.iloc[t - 1], hi, lo, 1.0, 0.0, pos.iloc[t - 1]) # 当日收益 = 当日价格 / 前日价格 - 1 ret = price.pct_change() # 策略收益 = 前日仓位 * 当日收益,仓位在前一日收盘已确定 strat_ret = (pos.shift(1) * ret).fillna(0) return pos, (1 + strat_ret).cumprod()这里最关键的是 pos.iloc[t] 用 score.iloc[t - 1] 生成,也就是 t 日的仓位在 t 日开盘前就已经定下来了,使用的是 t-1 日收盘后能拿到的全部信息。任何把当日 score 和当日收益放在同一行的写法,都隐含了未来函数。底层标的选择:如果你做的是 ETF 轮动,用 ETF 净值本身回测并扣管理费;如果做指数择时,直接用指数点位回测再在结果里扣成本,这会比用当前成分股拼历史更干净。
向量化回测的缺点是仓位连续变化时不好处理,但缓冲带机制下仓位只在几个离散值之间切换,这个缺点被天然规避了。空仓期的资金处理也要说明:按年化 2% 计现金收益是一种常见做法,也可以直接不计息,但报告里必须写明假设,否则年化收益会被系统性高估。
4.2 成本模型:佣金、印花税与滑点一个都不能少
交易成本是回测里最容易被低估的一环。ETF 和股票的成本结构不同:ETF 免印花税,但买卖两侧有佣金和滑点;股票卖出要交印花税,还要考虑冲击成本。择时系统年化换手率普遍在 5 到 15 倍之间,成本假设差一个千分点,年化收益就差一个多百分点,这个量级足以让一个策略从“有效”变成“无效”。
def cost_model(pos, price, cost=0.13e-2): # 仓位变动绝对值之和,乘单边成本 turnover = (pos.diff().abs().fillna(0)) # cost: 单边约0.13%,覆盖佣金万2.5+滑点/冲击0.1% total_cost = (turnover * cost).sum() return total_cost单边成本 0.13% 对 ETF 来说是偏合理的中性假设,佣金万 2.5 加上约 0.1% 的滑点。如果回测标的直接是股票或股票型指数基金,单边成本要上调到 0.2% 甚至更高,因为印花税和买卖价差都躲不掉。注意 turnover 用的是仓位 diff 的绝对值,也就是每次调仓实际买卖的仓位比例,而非调仓次数,两者的区别在于:一次从 0 加到 100% 的换手是 1.0,十次 10% 的小调仓合计换手也是 1.0,成本一样,但后者的滑点损耗通常更大,所以模型中滑点按成交比例计算是更贴近实际的近似。
回测结果的净收益计算公式是:毛收益减去累计换手乘以单边成本。如果回测里不打印换手率,说明这个回测框架还没建完。换手率不仅是成本计算的输入,也是判断策略是否可实盘的关键指标——年化换手超过 20 倍的择时策略,就算回测漂亮,实盘滑点也会让它表现打折。
4.3 指标组合:卡玛比率和月度胜率比夏普更可信
指标选取上,券商报告里最常展示年化收益和最大回撤,但评估择时系统时我建议按优先级来看下面这张表。
| 指标 | 侧重 | 在择时系统里的参考价值 |
|---|---|---|
| 年化收益 | 赚钱速度 | 低,容易被单一极端年份带偏 |
| 最大回撤 | 风险底线 | 高,择时的核心价值就是控回撤 |
| 夏普比率 | 收益/波动 | 中,对收益分布的正态性敏感 |
| 卡玛比率 | 收益/最大回撤 | 最高,直接刻画“赚得多且跌得少” |
| 月度胜率 | 盈利连续性 | 高,反映策略体验和资金曲线平滑度 |
夏普比率对大额正负收益非常敏感,一次极端行情就能显著扭曲它;择时系统的收益分布天然带尖峰厚尾,夏普并不擅长描述这类策略。卡玛比率等于年化收益除以最大回撤,最能说明这系统“扛不扛得住”,对择时策略来说,别人回撤 30% 你回撤 10%,复利效果远大于年化多赚 5%。月度胜率则能验证策略是否在持续输出——如果月度胜率只有 55%,但年化收益很高,说明收益集中在少数几个月,实际体验会很差。
def perf_stats(nav, turnover=None, rf=0.02): # 净值序列的绩效指标计算 ret = nav.pct_change().dropna() # 年化收益按几何平均计算 ann_ret = nav.iloc[-1] ** (252 / len(nav)) - 1 ann_vol = ret.std() * np.sqrt(252) sharpe = (ann_ret - rf) / ann_vol # 最大回撤:净值相对历史高点的最大跌幅 max_dd = ((nav / nav.cummax()) - 1).min() calmar = ann_ret / abs(max_dd) # 月度胜率:先按月重采样再计算 win = (ret[ret > 0].count() / ret.count()) if len(ret) else 0 return dict(ann_ret=ann_ret, ann_vol=ann_vol, sharpe=sharpe, max_dd=max_dd, calmar=calmar, win=win)年化收益用 nav.iloc[-1] 的几何平均,避免算术平均高估;当回测周期不满一年时,252/len(nav) 会失真,需要按自然日数换算。max_dd 用 nav/cummax-1 取最小再取绝对值,这是最大回撤的标准写法,不要在中间手动插桩找最低点。回测报告除了这些指标,还必须给年化换手率和月度收益分布,否则无法判断收益质量。记住一点:一份只贴净值曲线不给回撤和换手的报告,无论曲线多好看,都要留个心眼。
5. 多维度择时系统避坑指南:从数据到回测的5个常见翻车点
这部分是血泪经验,每一类我都亲眼见过不止一次翻车,现象、原因、解决方式分开说,方便你直接对照排查。
5.1 未来函数:当日信号偷看了当日收益
现象:回测曲线漂亮得像造假,但把信号延迟一天后收益大幅下降。原因:计算因子时用了当日收盘后才知道的成交额、涨跌家数或融资余额,但同一行代码里直接拿当日收益结算,相当于你拿着收盘答案去猜开盘结果。解决:写回测时统一约定——T 日收盘后生成信号,T+1 日开盘执行,代码里所有收益都用 shift 对齐,并单独写一个“信号日期与收益日期一致性”的自检函数。
5.2 幸存者偏差:用今天的成分股回测昨天的指数
现象:回测结果比真实可投收益高出好几个点,尤其在中小盘指数上很明显。原因:如果用当前指数成分股拼历史净值,那些当年被剔除的差股票根本没进回测,等于考试时先看了答案再做题。解决:择时系统直接使用指数点位或 ETF 净值做底层数据,不要用成分股拼接;如果必须用个股组合,务必用历史时点的真实成分列表,并模拟调仓换血过程。指数点位是经过历史检验的“已实现净值”,天然不含幸存者偏差。
5.3 阈值过拟合:全样本挑出的最优参数是“事后最优”
现象:65/35 缓冲带在这个样本上年化多赚 6%,换个时间段就失效甚至负贡献。原因:阈值是反复试出来的,试的过程中已经把随机噪声当成了规律。解决:样本前 70% 做网格搜索选定参数,后 30% 只允许跑一次验证;验证集一旦用了第二次,它就变成了训练集。正确流程是先定参数再跑样本外,而不是看到样本外不好再回头调参。
5.4 交易成本低估:高换手策略的回测收益被费用吃光
现象:回测净收益看着跑赢基准,但实盘持有一年下来,超额收益被费用磨损殆尽。原因:缓冲带设置太窄,比如分数在 55 到 65 之间反复穿越,每次穿越都是一次调仓;加上模型中滑点假设太乐观,实盘成交价往往比回测差。解决:在回测里强制打印年化换手率,如果超过 10 倍,把单边成本上调到 0.2% 重新跑一遍;同时考虑加宽缓冲带或引入最小调仓幅度约束。
5.5 市场状态切换:趋势指标在震荡市集体失效
现象:窄幅震荡行情里,技术面、资金面、情绪面信号互相矛盾,择时分数长期趴在 50 附近,策略频繁低仓位运行导致跑输基准。原因:因子背后的假设是趋势和情绪能够延续,震荡市里这两个假设都不成立。解决:在系统外叠加一个市场状态过滤器,比如用指数 20 日波动率的分位数识别“低波震荡”,这种状态下自动缩窄仓位区间;或者直接接受系统在震荡期低仓位运行——对择时系统来说,震荡期不亏钱本身就是收益来源,这一点在回测评估时要单独拿出来看。
6. 从回测到实盘:信号漂移监控与参数再校准的落地习惯
回测通过只是开始,真正让系统在实盘里持续有效的,是上线后的监控与校准。
6.1 监控信号漂移:滚动 IC 比盯净值曲线更早发现问题
每周计算一次择时分数与未来 5 日收益的滚动 20 周 IC。如果连续四周 IC 均值跌破 0,或者正负交替毫无稳定性,说明因子在当前市场状态下已失效。这个信号出现在净值回撤之前,能给你两周以上的缓冲时间。规则先行:IC 连续走弱就先降仓位,再去排查是市场状态变了还是因子本身出了问题。
6.2 参数再校准:固定频率加白名单约束
参数校准频率设成季度,每次只允许调整阈值和仓位区间,因子池不变。因子池的增删需要走独立评审,把它当成一次新的策略上线来处理,防止“觉得不对就换因子”滑向过度拟合。校准要留一口“后悔药”:换参数前保留旧参数的完整记录和绩效,避免三个月后想回头却找不到对照基准。
6.3 纸上交易:用模拟盘验证实际滑点与回测假设
上线前至少跑两个月模拟盘,重点验证真实成交滑点是否在回测假设范围内。模拟盘与实盘同步运行,记录每一次调仓的理论成交价和实际成交价,累计偏差超过 0.1% 就要重新评估成本模型。另一个习惯是把回测净值与模拟盘净值的偏差单独画一条曲线,偏差趋势性扩大说明模型细节出了问题,而不是行情问题。
我自己的最深教训是:回测不是终点,它只是证明“这个逻辑在历史上没犯大错”。真正保证实盘不翻车的,是信号监控和参数纪律,这两个动作不花哨,但能让系统在市场状态切换时多活两个周期。希望这份拆解能帮到你少走几步弯路。
本文还有配套的精品资源,点击获取