Files
MoFin/docs/research/methodology.md
T

371 lines
21 KiB
Markdown
Raw 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.
# MoFin 策略研究方法论总纲
> 唯一权威的方法论文档。所有策略研究必须遵循本文档的流程与铁律。
> 最后更新:2026-08-09(老莫要求从头整理,梳理清楚)
---
## 🔴 零、铁律(每一步必须自检,违反即重做)
> 2026-08-09 老莫怒斥后立规。**以下规则无例外,任何一步研究推进前必须逐条自检。**
### 铁律 0:禁止拍脑袋数值(最高优先级)
**任何阈值、目标价、止损价、参数,禁止凭空设定或"乘以一个系数"。**
- ❌ 禁止:`过去60日高点 × 0.9``固定 +15% 止盈``-10% 止损``RSI<45 拍脑袋`
- ✅ 必须:每个数值**注明来源**(来自哪一步数据归纳/哪条规则/哪个结构点),写不出来源 = 该数值作废
- **自检**:问自己"这个 0.9 / 15% / 45 是怎么来的?有数据证据吗?"——答不出 = 不能进代码
### 铁律 1:支撑/压力位必须用科学方法计算
**支撑位、压力位、入场区间、出场区间,全部基于技术分析结构,禁止用固定窗口/固定百分比。**
- 可用的科学方法(老莫指定):
1. **筹码密集区**上下沿(成交密集的价格区间 = 强支撑/强压力)
2. **均线系统**MA20/MA60/MA120,股价与均线的相对位置、均线多空排列)
3. **通道上下沿**(趋势通道的边界)
4. **前高/前低**(结构点,突破/跌破才有意义,不是"最近20日最高/最低"
- **强弱判断**:强支撑 = 多方法共振(筹码密集+均线+前低都在这附近);弱支撑 = 单一方法孤立点
- **自检**:每个支撑/压力位,能否说出"这是筹码密集区上沿 / MA60 / 前高结构点"?说不出 = 重算
### 铁律 2:RR(风险回报比)必须基于科学支撑压力
**RR = (压力位 - 入场价) / (入场价 - 支撑位),压力位/支撑位必须来自铁律1的科学计算。**
- ❌ 禁止:`target = 未来高点`(前视)、`target = 过去高点×0.9`(拍脑袋)
- ✅ 必须:目标价 = 上方第一个强压力位(筹码密集上沿/均线/前高结构点);止损价 = 下方第一个强支撑位(筹码密集下沿/均线/前低结构点)
- **无科学支撑压力的信号 = 不交易**(RR 无法计算 = 仓位无法确定 = 不做)
### 铁律 1b:科学支撑压力计算规范(落地公式,2026-08-09 明确)
**四个关键点位 = 枢轴点系统(Pivot Points,经典技术分析方法)+ 筹码密集区**
**① 枢轴点系统(四点位:强支撑S2/弱支撑S1/弱压力R1/强压力R2**
基于当日(或回看窗口)最高H、最低L、收盘C:
```
PP = (H + L + C) / 3 # 枢轴点
S1 = 2×PP - H # 弱支撑
R1 = 2×PP - L # 弱压力
R2 = PP + (PP - S1) # 强压力(= PP + 有效区间)
S2 = PP - (PP - S1) # 强支撑(= PP - 有效区间)
```
- **effective_range(有效区间)** = max(当日波幅, 多日平均波幅, 价格×5%);高位/低位运行扩大到 8%
- 用途:S1/S2 = 下方两级支撑(破 S1 减仓、破 S2 清仓);R1/R2 = 上方两级压力(到 R1 减仓、到 R2 清仓)
- 这是有学术/实践意义的经典方法(源自期货日内交易 Pivot 技术,MoFin `calc_support_resistance` 即此实现)
**② 筹码密集区(MoFin `calc_chip_sr` 实现)**
- 从日线 K 线(640 日 qfq 前复权)构建筹码分布:每根 K 线成交量按 OHLC 区间均匀分配(约5档),每日衰减 0.97
- 2% 区间聚合:价格按 2% 步长分桶,累加成交量
- **支撑** = 当前价下方成交量最大的密集区桶上沿;**阻力** = 当前价上方成交量最大的密集区桶下沿
- 用途:中长线支撑/压力参考(价下最大量=支撑/价上最大量=阻力)
**③ 强弱判断(共振 = 强,孤立 = 弱)**
- **强支撑/强压力** = 多方法共振:枢轴 S2/R2 + 筹码密集区 + 均线(MA20/60/120)+ 前高/前低结构点,两个以上落在同一区域
- **弱支撑/弱压力** = 单一方法孤立点(如只有枢轴 S1,无筹码/均线/结构配合)
- 实证:距前低<5% 的票(近支撑)avg +10.93%/wr70%;距前低>10% 的票(无支撑)avg 崩至+4%以下(MoFin §17
**④ RR 取位规则**
- 压力位 = 最近的上方强压力(优先 R2/筹码阻力,其次 R1);支撑位 = 最近的下方强支撑(优先 S2/筹码支撑,其次 S1)
- RR = (压力位 - 入场价) / (入场价 - 支撑位)RR < 1.5 不交易
- 深超跌票(下方无可靠技术支撑)→ 止损用固定规则(数据归纳),不硬套支撑位
**⑤ 止损止盈必须预留余量(2026-08-09 老莫补充,防洗盘/假触及)**
- **止损**:不设在支撑位本身,设在支撑位**下方 × 缓冲余量**——主力可能蓄意击穿支撑洗盘,机械止损会被洗出去
- **止盈**:不设在压力位本身,设在压力位**附近/下方留余量**——价格可能在到达压力位之前就下跌,或只瞬间触及就迅速回落
- **余量大小必须数据验证**:不同余量(0%/1%/2%/3%/5%)在历史信号上的收益/胜率/回撤对比,取数据最优者
- **禁止拍脑袋定余量**(如"就 2% 吧")——必须跑余量敏感性测试
- 参考实证:弱支撑 S1 距入场仅 1.6% → wr 崩至 17.9%(太近,一买就被扫)——余量过小/支撑过近同样致命(MoFin §17.4)
### 铁律 3:入场/出场区间必须用结构点定义
- **入场**:不是"回升3%就买",而是"价格到达支撑/压力结构确认点"(如回踩支撑企稳、突破压力确认)
- **出场**:不是"涨15%卖",而是"价格到达上方压力结构点分批卖";止损不是"-10%",而是"跌破下方支撑结构点"
- **每次重评**:价格触及结构点时,用 12 维重新评估(铁律的落地方式)
### 铁律 4:每一步推进前,先念一遍自检清单
**开始任何计算/写代码/下结论前,逐条确认:**
- [ ] 这个数值有数据来源吗?(不是拍脑袋)
- [ ] 支撑/压力位是筹码密集/均线/通道/结构点算的吗?(不是固定窗口)
- [ ] RR 用了科学支撑压力吗?(不是"未来高点"/"过去高点×系数"
- [ ] 入场/出场是结构点定义吗?(不是固定百分比)
- [ ] 有前视偏差吗?(未来数据禁止用于信号/参数/仓位)
- [ ] 结论经过全市场验证 + 负面剔除 + 去极端年了吗?
- **任何一条不过 → 停手,先修正再继续**
### 铁律 5:违反后的处理
- 发现自己/脚本违反了铁律 → **立即停下**,承认,重做该步骤
- 不掩盖、不将错就错、不用"约等于"糊弄
- 老莫的验收标准(年化≥13.2%)只有在**全部铁律遵守**的前提下才有意义
---
## 一、研究出发点(老莫定的)
1. **唯一验收标准**:策略实操年化 ≥ 大盘涨幅 + 10 个百分点
- 大盘基准(上证 2016-2026):年化 3.2%,累计 34.4%
- **达标线:年化 ≥ 13.2%**
- 不达标 = 策略无价值,不做
2. **研究要与 MoFin 实际应用整合**:策略要能嵌入 MoFin 工作流(选股→入场→出场→重评)
3. **验真证伪优先**:先证明策略真实有效,再谈上线
## 二、MoFin 工作流程(策略嵌入的框架)
```
选股 → 入场(分仓,多次)→ 出场(分仓,多次)→ 每次重评
```
1. **选股**:全市场扫描 → 候选池(多维度评分排序)
2. **入场**:定入场区间(entry_low/entry_high),分批建仓,每次评估策略是否成立
3. **出场**:支撑位下方×缓冲止损(防洗盘)/ 压力位止盈,分批减仓
4. **重评**:每次价格触及关键位(支撑/压力)时重新评估,订立/修正策略
**关键**:策略不是"买入持有到固定时间",而是持仓期间持续重评。
## 三、12 维重评框架(核心工具)
### 3.1 定义:12维 = 3层级 × 4维度
| | **消息面** | **基本面** | **技术面** | **资金面** |
|---|---|---|---|---|
| **大盘** | 大盘新闻/情绪 | 宏观指标 | mkt_rsi / mkt_adx / mkt_ret1 | 两市成交量/北向 |
| **行业** | 行业新闻热度 | 行业景气 | sec_ret1 / sec_above / 行业动量 | 行业资金流 |
| **个股** | news33日新闻数)/ 情绪 | 市值/PE/PB | rsi / bias60 / bias20 / dist_lo20 / ret1 / limit_up / hi20_new / limit_n / 缩量 | flow55日资金流)|
**落地因子**(脚本已实现):mkt_rsi、mkt_adx、mkt_ret1、sec_ret1、sec_above、rsi、bias60、bias20、dist_lo20、flow5、news3、ret1、limit_up、hi20_new、limit_n、缩量shrink
### 3.2 用途一:由果及因挖因子(逆推法)
**先找到真实大涨段(果)→ 12维全景画像(因)→ 找分层器 → 归纳因子组合 → 验证**
| 步骤 | 内容 | 要点 |
|---|---|---|
| 1. 果 | 定义显著收益票 | 如60日≥p90,覆盖全市场,非单一年份 |
| 2. 因 | **12维全景画像** | 真实买点均值 vs 随机均值,找分层维度 |
| 3. 全市场筛 | 因子组合全市场重筛 | 验证不是样本内拟合 |
| 4. 负面剔除 | 筛集内亏损vs盈利对比 | **负面剔除 > 正面排序** |
| 5. 正负合并 | 剔除亏损共性 | 保留正因子 |
| 6. 稳健验证 | 去极端年+覆盖≥80月+正贡献≥7年 | 非过拟合 |
### 3.3 用途二:每个买卖点/信号的重评依据(老莫核心要求)
**MoFin 工作流是"选股→入场→出场→每次重评",而重评的依据就是 12 维全景**
- **入场重评**:信号出现时,不只是看触发条件,还要看 12 维是否共振(大盘状态 + 行业状态 + 个股各维度)
- **出场重评**:价格触及支撑/压力时,用 12 维判断"该走该留"(大盘转弱?行业转弱?资金流出?)
- **信号分层**:同一信号池内,用 12 维分位数区分强弱(如 dist_lo20、rsi 分位)
**落地脚本**
- `mofin_12d_mining.py` — 弱市日全市场 12 维因子档位 vs 随机基线(找分层器)
- `mofin_12d_mining_v2.py`**v2 补全基本面维度**(PE/PB/市值分位,真实历史数据)
- `mofin_12d_profile.py` — 真实买卖点 × 12维画像(不预设规则,让数据归纳)
### 3.4 12维挖掘实证结论(弱市日全市场 2018-2026,300万样本)
**口径**:大盘<MA20 弱市日 + 全市场 A 股,未来60日收益 vs 随机基线(avg60=6.56%
**最强正向分层器(弱市选股 alpha)**
| 维度 | 最佳档 | avg60 | 超额 |
|---|---|---|---|
| **市值分位** | 最小市值 | 13.13% | **+6.57pp** |
| **大盘RSI** | 最低(恐慌) | 10.45% | **+3.89pp** |
| 5日资金流 | 中高(2-3档) | 9.46% | +2.90pp |
| PE_TTM分位 | 最低估值 | 9.03% | +2.48pp |
| PB分位 | 低(1档) | 8.32% | +1.77pp |
**最强负面维度(弱市规避)**
| 维度 | 最差档 | avg60 | 超额 |
|---|---|---|---|
| **市值分位** | 最大市值 | 2.65% | **-3.90pp** |
| PB分位 | 最高估值 | 2.72% | -3.84pp |
| 行业20日动量 | 最强 | 3.41% | -3.14pp |
| 当日涨停 | 涨停后 | 3.63% | -2.93pp |
| 距20日低点 | 最远 | 4.30% | -2.26pp |
**核心结论(弱市策略铁律)**
1. **弱市选小盘低估**(小市值+6.57pp、低PE+2.48pp、低PB+1.77pp)——与"弱市仓位管理>选股"互补
2. **弱市不追高**(大市值/高PB/强行业动量/涨停/20日新高全负)——做超跌低吸,不做强势
3. **大盘恐慌日超额最高**RSI最低档+3.89pp)——对应 v_weak 的 ADX 甜区逻辑
4. **资金流中高为正、极高为负**2-3档+2.9pp4档-4.1pp)——资金流见顶后是出货
**对 v_weak 的指导**:六条件基础上叠加**市值/估值过滤**(排除大市值高PB票),聚焦小盘低估,弱市收益可提升。
**禁止**
- ❌ 拍脑袋定指标再找数据验证(先射箭再画靶)
- ❌ 固定天数/数值/阈值(为什么是60不是50?)
- ❌ 单日特征识别买卖点(当天可能洗盘)
- ❌ 事后指标当信号(拉升当天资金流入=结果非原因)
## 四、验真证伪流程(必须遵守)
### 4.1 数据准备(第一步,必须做)
| 检查 | 方法 | 通过标准 |
|---|---|---|
| **除权/复权异常** | 剔除单日\|ret\|>25% | A股涨跌幅上限(主板±10%/创业板科创板±20%)|
| **停牌处理** | 缺失日期不参与 | 不产生假收益 |
| **复权一致性** | 全市场统一复权口径 | 无个别票暴跳 |
| **快照偏差** | 检查"当前市值/行业"是否用于历史 | 用历史或当日数据 |
### 4.2 信号验证
| 步骤 | 方法 | 铁律 |
|---|---|---|
| 1. 无前视 | 信号只用 t-1 及以前数据 | 月频用上月;快照不筛历史 |
| 2. 路径模拟 | 止损/止盈/时间退出 逐日模拟 | **面板fwd正收益≠可交易** |
| 3. 统一资金 | 资金约束+信号排队+逐日净值 | 单笔理想化年化≠真实 |
| 4. 生态检验 | 分年检查+去极端年 | 当前生态正,旧生态可接受 |
| 5. WFO | IS优化→OOS验证→滚动 | OOS是IS"打折仍认得出" |
### 4.3 四大陷阱(回测膨胀根源)
1. **过拟合**:反复调参记住噪声 → 用 WFO 验证流程,不扫描找最优
2. **前视偏差**:shift错/收盘后数据/快照 → 严格 t-1
3. **选择偏差**:只展示最好变体 → 展示全部(含失败)
4. **制度盲区**:特定环境测试好部署崩 → 生态检验
### 4.4 引擎验证(重要)
- **自建模拟引擎必须先验证**:用 MoFin 已验证策略(如 v_weak 年化15-16.7%)做基准测试
- 引擎跑不出接近结果 = 引擎有 bug,不能用于策略结论
- **未验证引擎的数字不可信**
## 五、已确认的坑(勿重犯)
1. pivot宽表shift/pct_change是行位移 → 停牌股假信号
2. 幸存者样本(196个成功段)特征不可外推
3. 面板fwd正收益≠可交易(必须路径模拟)
4. 前视偏差:月频信号用t-1数据;快照(当前市值)不筛历史
5. 信号定义必须用真实参数(v4误定义成深超跌的教训)
6. 支撑/压力禁止固定窗口(筹码密集区/swing/通道/均线)
7. 单笔理想化年化≠统一资金模拟(资金约束摊薄)
8. 除权数据污染(|ret|>25%集中在2024-2026)——模拟前必须剔除
9. 当前市值筛选历史信号=前视偏差
10. 反复调参=过拟合,按 WFO 验证流程
## 六、MoFin 已验证的结论(可直接用)
### 弱市(MoFin 验证达标)
- **弱市无选股alpha"仓位管理>选股"**(§12
- **等权6槽 > 任何分级仓位**(§15)
- **每月限8信号 > 过滤/止损**(§16
- **深超跌票下方无可靠技术支撑,用固定止损**(§18)
- **大盘ADX是弱市edge前提**:甜区[25,30](§13
### v_weak(弱市策略,实盘 mr_scanner.py 在跑)
- 大盘:上证<MA20 + ADX∈[25,30]甜区
- 个股六条件:bias60∈[-35,-20) + RSI≤25 + 5日急跌≤-3% + 距前低<5% + 收阳 + 缩量
- 出场:固定-12%止损/+30%止盈/40日
- 仓位:等权6槽自然序 + 每月≤8信号
- 组合:年化15-16.7%/回撤19.4%MoFin验证)
### 牛市方向(研究增量)
- **叙事龙头**:上月新闻升温行业 + 行业市值Top25%龙头
- 关键:新闻升温≠主线,需行业动量确认(ret20>0)
- 出场:科学支撑压力(筹码密集区)
- **状态**:引擎未验证,待 MoFin 引擎下验证达标(≥13.2%
## 七、仓位管理(MoFin 实盘规则)
### RR→仓位映射(MoFin 源码)
```
RR<1.5 → 不推荐
1.5~3 → 8%
3~5 → 12%
5+ → 15%
×成长系数0.85 → clamp[5,20](典型6-12%
```
- 买入资格:RR≥2.0 + 现金预算内
- 换仓:现金不足时卖6维评分最差弱持仓
- 移动止损:止损只上不下
## 八、文档体系
| 文档 | 用途 |
|---|---|
| **本文档** | 方法论总纲(权威,铁律/流程/标准)|
| 研究日志 | 时间线事实记录(做了什么/发现/待办)|
| 策略现状 | 当前策略状态、达标情况、数据资产 |
| 脚本清单 | 脚本管理(保留/归档/删除)|
## 九、本次研究新结论(2026-08-10,数据驱动验证达标)
> 由果及因完整链路:大涨段(果)→ 12维预测因子扫描 → 三段分析 → 统一资金模拟。
> 全部阈值经数据扫描(step27-37),无拍脑袋。
### 9.1 预测性信号(事前可计算,核心成果)
**弱市+小市值+低PE+新闻+行业跌+深跌**:
```
大盘RSI < 50(弱市/恐慌)
+ 市值分位 < 0.2(小市值)
+ PE分位 < 0.2(低估值)
+ 新闻数 ≥ 1(消息面)
+ 行业20日动量 < 0(行业弱)
+ 个股bias60 < -20(深度超跌)
+ 大盘距60日高点回撤 ≤ -5%(非高位/牛市)
```
- **大涨率 10-11.6%**(全市场基线 3.52% 的 3.4 倍)
- avg60 14.6-18.2%、胜率 68-74%(单信号)
- **预测力随因子叠加单调提升**3.52→6.96→9.41→11.61
### 9.2 关键数据发现(打破直觉)
1. **牛市强者恒强不可交易**:追涨信号(行业强+龙头+前60涨)avg60 为负(-0.3~-2.1%)——强者恒强是"结果"不是"可预测入场信号"
2. **超跌策略需大盘门控**:大盘RSI<50时 avg16-18%>60时衰减到 5.9%
3. **大盘深跌末期信号最强**:大盘回撤15-20%时 avg60 31.2%、胜率93.8%
4. **支撑压力保护兑现收益**:裸持有5.13% → 支撑保护9.63% → 阶段过滤14.75%
### 9.3 最终策略(统一资金模拟验证)
- **入场**:信号日收盘买(step30验证最优)
- **止损**:科学支撑位(枢轴S2/筹码支撑)下方5%缓冲(step34验证)
- **止盈**:压力位(枢轴R2/筹码阻力)分批卖(step34验证)
- **兜底**40日持有(step30验证)
- **资金**10槽 + 15%仓位(step35参数扫描)
- **结果****年化 14.75%**(达标≥13.2%)、胜率90.3%、单笔+16.39%、总收益329.5%
- **待改进**:回撤-36.4%偏大、2019年-6%亏损年
## 十、温区自适应方法论(2026-08-13 新增)
> 核心认知(来自量化文献+MoFin实证):**没有任何策略能在所有市场环境通吃**——每个策略有它的"适用温区"(市场状态),策略组合应按当前温区自动激活/休眠。
### 10.1 温区三态判定
- **trend_up**(趋势市):above_ma20 + adx≥20——趋势策略(追涨/龙头识别)适用
- **choppy**(震荡市):adx<20——均值回复策略(超跌反弹)适用
- **trend_down**(下跌市):below_ma20 + adx≥20——深超跌/恐慌策略适用
**滞回平滑(K=5**:连续5天同温区才确认切换(数据选参:112周期/20.7天/无1天噪音),避免单日噪音误判。
### 10.2 温度(rsi 连续维度)
- **温度分档**panic(<35) / fear(35-45) / neutral(45-60) / greed(60-70) / euphoria(>70)
- **仓位乘数**:恐慌重仓(mr 1.5倍)、亢奋减仓(0.3倍)
- **温区与温度互补**:温区滞后(K=5确认)、温度实时(rsi连续量)
### 10.3 策略-温区对应(数据验证)
| 策略 | 适用温区 | 胜率 | 依据 |
|------|---------|------|------|
| v_weak | choppy | 55% | 震荡市超跌确认 |
| v_oversold | trend_down | 60% | 下跌市深超跌 |
| v_mr_sel | trend_down | **93%** | 精选小盘超跌 |
| v_next4/v8.1 | trend_up | 63%/57% | 趋势市追涨 |
| s2_panic | trend_down×恐慌 | 86% | 极端恐慌买超跌 |
| v_lurk_v3 | choppy/trend_down | 77%/71% | 潜伏型 |
**原则**:策略全温区发信号(内部不留温区门控),适用温区由**实测胜率动态决定**strategy_regime_perf 表常态化更新),不是固定映射。
### 10.4 组合构建(温区自适应)
- **单一策略是茧,多策略是翅膀**:策略组合按当前温区自动激活/休眠
- **分散化本质是低相关性**:跨策略类型(趋势/均值回复/事件驱动)组合
- **动态配置克制**:温区切换才调权重,"少动就是多赚"
- **失效预警(三振出局)**:滚动胜率 <40% 黄牌减半、<35% 橙牌1/4、<30% 红牌淘汰(权重0观察)
### 10.5 信号溯源
- 每次推送记录:策略/版本/温区/原因(signal_ledger 表)
- **多策略共振**:同一股票24h内被多个激活策略推 → 标记"🔥多策略共振"(加关注)
- 用途:日后评估"哪个策略在什么温区推了什么股票,效果如何"
### 10.6 落地文件
| 文件 | 功能 |
|------|------|
| market_regime.py | 三态判定(已有,回填10年) |
| regime_tracker.py | 滞回平滑(K=5+ regime_cycles 周期记录 |
| temp_band.py | 温度分档 + 仓位乘数 |
| regime_perf.py | 策略-温区表现常态化记录 |
| strategy_router.py | 动态策略路由(strategy_weights.json |
| strategy_executor.py | 温区策略调度器(按激活策略调度 scanner) |
| signal_ledger.py | 信号溯源(推送记录+共振标记) |
> 详见 SYSTEM_ARCHITECTURE.md 五.5 温区自适应系统(系统架构视角)。