把交易策略的完整逻辑梳理成文档。这份文档基于 策略Opus4.6.docx(代码逻辑版本),已确认采用。
“左侧抄底冰点,右侧追首阴”——在市场极度恐慌时无脑抄底并死扛至过热;在趋势良好时,利用连涨后的首次回调做短线波段。
| 指标 | 变量名 | 定义 | 关键阈值 |
|---|---|---|---|
| 市场广度 | breadth | 中证500成分股中站上20日均线的个股比例(%) | 冰点 <16%,过热 >79% |
| 资金热度 | heat_z | 中证500指数成交额的20日 Z-Score | 过热 >1.5σ |
| 趋势防守线 | ma_30 | 30日均线(MA_Filter) | 多空分界线 |
| 短期趋势线 | ma_10 | 10日均线(MA_Trend) | FirstNeg 入场条件 |
| 近期支撑线 | ma_5 | 5日均线(MA_Support) | FirstNeg 入场条件 |
| 连涨动能 | consec_gains | 连续上涨天数 | >=3 天为强劲 |
Z-Score 是”和过去比,今天有多反常”。举两个例子:
只有”相对于过去的正常波动来说,今天的成交额异常偏高”,Z-Score 才会突破 1.5,被判定为资金过热。
用”涨跌方向切换分组”:每次涨跌方向变化时新开一组,组内累计天数就是连涨/连跌天数。
df['is_up'] = (df['close'] > df['close'].shift(1)).astype(int)
df['streak_group'] = (df['is_up'] != df['is_up'].shift(1)).cumsum()
df['streak'] = df.groupby('streak_group').cumcount() + 1
df['consec_gains'] = np.where(df['is_up'] == 1, df['streak'], 0)
策略每天收盘后检查是否触发买入,分两种场景(Composite 优先判断):
触发条件:市场广度 < 16%
就这一个条件。全市场不到 16% 的股票站在均线上方,属于极度超卖的”冰点时刻”。
动作:
场景 A 不满足时才检查场景 B。
触发条件(6 个条件必须全部满足):
| 条件 | 含义 | 判断逻辑 |
|---|---|---|
| 趋势向上 | 大方向没问题 | close > MA10 |
| 动能强劲 | 之前涨势够猛 | 昨日连涨天数 >= 3 |
| 首阴回调 | 今天终于跌了 | 今日 close < 昨日 close |
| 放量确认 | 市场有人在交易 | ETF 换手率 > 1.0% |
| 支撑有效 | 短期均线还撑得住 | close > MA5 |
| 大趋势保护 | 中期均线没破 | close > MA30 |
动作:同 Composite,产生买入信号,标记为 FirstNeg。
如果已经在 FirstNeg 持仓中,市场突然崩盘导致广度跌破 16%,策略会自动把状态从 FirstNeg 升级为 Composite。这样做的好处是:不再受 FirstNeg 的严格止损约束,切换到”死扛等反转”的模式。
广度 > 79% 且 heat_z < 1.5 → 卖出
解读:”缩量普涨”意味着市场已经涨到头了——大家都在涨但资金没跟上,见顶信号。反过来,如果 heat_z > 1.5(资金还在猛烈涌入),即使广度过热也先不卖,说明还有资金推动的空间。
采用组合条件退出,不是三个条件任选其一:
退出 = 跌破 MA30 AND (当日下跌 OR 5日不创新高)
具体来说:
| 条件 | 代码变量 | 含义 |
|---|---|---|
| 前提 | is_below_ma | 收盘价 < MA30(趋势破位) |
| 叠加 a | is_1d | 今日收盘 < 昨日收盘(当日还在跌) |
| 叠加 b | is_5d | 持仓 >= 5 天,且期间收盘价从未超过 entry_high |
必须先满足前提(跌破 MA30),再叠加 a 或 b 任一确认,才触发卖出。
单独跌破 MA30 不卖(可能只是暂时回踩),单独下跌也不卖(可能还在 MA30 上方)。
与原始文档的差异:原始”策略逻辑.docx”描述为三个条件纯 OR(任一满足即卖出),代码实现是以跌破 MA30 为前提的 AND 组合。我们采用代码版本。
entry_high = df['high'].iloc[i]与原始文档的差异:原文暗示应滚动更新为”买入后达到的最高价”,代码只记录一次。我们采用代码版本。
| 项目 | 规则 |
|---|---|
| 执行模型 | T+1:信号在 T 日收盘后确定,T+1 日开盘价执行 |
| 仓位 | 全仓进出,0 或 1,不做部分仓位 |
| 方向 | 纯多头,不做空 |
| 单边成本 | 0.1%(千分之一),含滑点和手续费 |
收益计算方式:
(close / open - 1) - 0.001(open / prev_close - 1) - 0.001close / prev_close - 1| 数据 | 来源 | 说明 |
|---|---|---|
| 价格(OHLCV)+ 均线 | 中证500指数 000905.SH | 无需复权 |
| 资金热度(heat_z) | 中证500指数成交额 | 无需复权 |
| 市场广度(breadth) | 成分股个股数据 | 基于后复权收盘价计算 MA20 |
| ETF 换手率(etf_turnover) | 510500 ETF | 仅此字段用到 ETF 数据 |