# A股+美股量化策略库（含参数库）

> 梳理日期: 2026-07-29 (2026-09-01更新: 美股回测起点统一1990-01-01, 参数重搜)
> 回测起点: A股 2024-09-20, 美股 1990-01-01 (yfinance/Tushare SPX同源, 与估值图一致)
> 数据截止: 2026-07-28
> 约束: 无杠杆 (max_pos=1.0), T+1执行

---

## 一、策略框架总览

### 1.1 核心信号体系

所有A股策略共用一套信号体系，分三个层次：

**第一层: MA偏离度**
- 计算: dev = (close / MA - 1) * 100
- MA周期: 60, 100, 120, 150, 200, 250, 300
- 意义: 当前价格相对均线的偏离百分比

**第二层: 偏离度百分位**
- 计算: pct = percentileofscore(pool, dev)
- pool: 回测区间内所有dev值（pool_start=bt_start=2024-09-20）
- 意义: 当前偏离度在历史中的相对位置，0%=极度低估，100%=极度高估
- 关键: pool只用回测区间数据，不用expanding（expanding漂移全败）

**第三层: 偏离度波动率**
- vol20 = dev.rolling(20).std()
- vol30 = dev.rolling(30).std()
- vol_median = 回测区间内vol的median
- 动态调整: scale = vol / vol_median, 买线=buy_line*scale, 卖线=100-(100-sell_line)*scale
- 意义: 波动大时自动放宽买入条件（更易买），降低卖出阈值（更早卖）
- 创业板50额外: scale = min(max(vol/vol_median, 0.5), 3.0) 限制缩放范围

### 1.2 美股信号体系

**SP500: 波动率目标策略 (Volatility Target)**
- 信号: 收益率波动率 (dvol=滚动标准差, ewma=指数加权)
- 核心公式: position = min(max_pos, target_vol / current_vol)
- 趋势过滤: close < MA200 且 pct60 > guard 时，仓位=min(position, trend_cap)
- 参数(2026-09-01重搜, 1990起点): vol_type(dvol/ewma), vol_period(5/20/30), target_vol(0.5~3.0), ma_trend(200), pct_guard(0/70/80), trend_cap(0.0)
- 定稿组合: dvol锐进(5/3.0/70高收益参考) + dvol20低波0.75 + dvol30低波0.75 + dvol30低波0.5(稳健主线)

**IXIC: 条件趋势策略 (Conditional Trend)**
- 信号: 偏离度百分位（与A股相同框架）
- 买入: pct_buy <= buy_line, 仓位 = ((buy_line - pct) / buy_line) ** buy_power
- 卖出: pct_sell >= sell_line, 仓位 = min(position, ((100-pct)/(100-sell_line)) ** sell_power)
- 趋势过滤: close < MA_trend 且 pct_buy > pct_guard 时，仓位=min(position, trend_cap)
- 双MA: 买入用短期MA百分位(ma_buy), 卖出用长期MA百分位(ma_sell)
- 参数(2026-09-01重搜, 1990起点): ma_buy(50/60), ma_sell(200/250/300), buy_line(30), sell_line(95), buy_power(0.3), sell_power(2.0/3.0), pct_guard(70), ma_trend(100), trend_cap(0.0)

---

## 二、回测引擎详解

### 2.1 A股统一回测引擎

```python
def backtest(signal, buy_line, sell_line, buy_power, sell_power, ret,
             dynamic_vol=None, vol_median=None):
    pos = pd.Series(index=signal.index, dtype=float)
    position = 0.0
    
    for i in range(len(signal)):
        sig = signal.iloc[i]
        if np.isnan(sig):
            pos.iloc[i] = position
            continue
        
        bl = buy_line
        sl = sell_line
        
        # 动态波动率调整
        if dynamic_vol is not None and vol_median is not None:
            vol = dynamic_vol.iloc[i]
            if not np.isnan(vol) and vol_median > 0:
                scale = vol / vol_median
                bl = buy_line * scale
                sl = 100 - (100 - sell_line) * scale
        
        # 买入逻辑: max(position, target) -- 只加不减
        if sig <= bl:
            target = max(position, ((bl - sig) / bl) ** buy_power) if bl > 0 else 1.0
        # 卖出逻辑: min(position, target) -- 只减不加
        elif sig >= sl:
            target = min(position, ((100 - sig) / (100 - sl)) ** sell_power) if sl < 100 else 0.0
        else:
            target = position
        
        position = np.clip(target, 0, 1)
        pos.iloc[i] = position
    
    # T+1执行: 用前一日仓位乘当日收益
    strat_ret = (ret * pos.shift(1)).fillna(0)
    nav = (1 + strat_ret).cumprod()
    return nav, pos
```

### 2.2 关键引擎细节

1. **买入单调约束**: 买入时 target = max(position, new_target)，确保买入只会加仓不会减仓
2. **卖出单调约束**: 卖出时 target = min(position, new_target)，确保卖出只会减仓不会加仓
3. **T+1执行**: strat_ret = ret * pos.shift(1)，用前一日仓位乘当日收益
4. **NAV计算**: 先算 strat_ret 再 fillna(0)，不能先fillna再算
5. **MA完整历史**: MA先在全历史计算rolling，再filter到回测区间
6. **百分位池**: pool = df.loc[pool_start:, 'dev'].dropna().values，仅回测区间

### 2.3 双MA回测变体

当 ma_buy != ma_sell 时，买入和卖出使用不同MA的百分位信号：
- sig_buy = pct[ma_buy]（短期MA，抓买点更敏感）
- sig_sell = pct[ma_sell]（长期MA，判卖点更稳定）
- 优先级: 先判卖出，再判买入

### 2.4 回撤触发卖变体（动态sell_line）

传统策略sell_line固定不变。回撤触发卖改为根据价格回撤程度动态调整sell_line：

公式:
- price_dd < dd_threshold 时: sl = 100（不触发卖出）
- price_dd >= dd_threshold 时: sl = max(dd_base_sl, 100 - dd_sens × (price_dd - dd_threshold))
- 再经vol20调整: sl_final = 100 - (100 - sl) × vol_scale

参数说明:
- price_dd: 当前价格相对持仓期间高点的回撤百分比
- price_high: 仓位>1%时持续追踪高点，仓位<1%时重置为当前价
- dd_threshold: 回撤阈值，小回撤完全不卖
- dd_base_sl: sell_line下限，回撤极大时的卖线底线
- dd_sens: 回撤每超阈值1%，sell_line降低多少

行为示例（dd_threshold=3, dd_base_sl=50, dd_sens=15, sell_power=5, vol_scale=1.5）:
- dd=0%（涨势中）: sl=100, 不触发卖出, 仓位不变
- dd=2%（小回撤）: sl=100, 不触发卖出, 仓位不变
- dd=5%（超阈值2%）: sl=max(50, 100-15×2)=70, sl_final=100-(100-70)×1.5=55
- dd=10%（中回撤）: sl=max(50, 100-15×7)=max(50,-5)=50, sl_final=100-(100-50)×1.5=25

核心逻辑: 先高pct预警但价格未回撤时不卖，等价格真正回撤超过阈值后才触发减仓。
解决固定sell_line+vol20在上涨行情中因波动率放大而过早离场的问题。

与回撤动态幂（已废弃）的区别:
- 动态幂: 改sell_power，但fraction<1时幂越高卖越多，dd=0时高幂反而卖最多（方向反了）
- 回撤触发卖: 改sell_line，dd=0时sl=100直接不触发卖出，方向正确

配置方式: strategy_config.json中策略用dd_threshold+dd_base_sl+dd_sens替代固定sell_line逻辑。
backtest()检测到dd_threshold时自动启用动态sell_line，否则用固定sell_line。

逐指数调参结果（2026-07-29）:
- CS人工智能: dd_th=2, base_sl=50, sens=30, power=12, 收益234.1% Sharpe2.74 回撤-13.6%（超越原最优）
- 中证机床: dd_th=3, base_sl=50, sens=15, power=5, 收益169.3% Sharpe2.18 回撤-14.6%（超越原最优）
- 中证科技: 持平，不采用
- 中证半导体: 更差（现有极致收益已足够好），不采用

### 2.5 硬止盈变体

当 hard_sell < 100 时：
- sig_sell > hard_sell 时直接清仓到 hard_sell_target
- 中证机床"硬止盈均衡"策略使用 hard_sell=90, target=0.0

### 2.5 指标计算

- 总收益 = (nav[-1]/nav[0] - 1) * 100
- Sharpe = daily_ret.mean() / daily_ret.std() * sqrt(252)
- 最大回撤 = (nav/nav.cummax() - 1).min() * 100
- Calmar = 年化收益 / |最大回撤|，年化 = (nav[-1]/nav[0])^(252/days) - 1
- 均仓 = pos.mean() * 100
- 末仓 = pos.iloc[-1] * 100

---

## 三、参数搜索空间

### 3.1 A股搜索空间（sweep_399673_v3.py / sweep_931866_v2.py）

**搜索维度（8维）:**

| 维度 | 搜索值 |
|------|--------|
| ma_buy | 60, 100, 120, 150, 200, 250 |
| ma_sell | 100, 120, 150, 200, 250, 300 |
| vol_type | static, vol20, vol30 |
| buy_line | 5, 10, 15, 20, 25, 30, 40, 50 |
| sell_line | 70, 75, 80, 85, 90 |
| buy_power | 0.3, 0.5, 0.7, 1.0 |
| sell_power | 0.3, 0.5, 0.7, 1.0, 1.5, 2.0 |
| rebuy_mode | 0(max约束), 1(绝对目标) |

**硬止盈子搜索:**
- buy_line: 15, 20, 30
- sell_line: 80, 85
- sell_power: 0.5, 1.0
- hard_sell: 90, 93, 95

**中证机床额外搜索（sweep_931866_v2.py）:**
- sell_power: 3.0, 5.0, 8.0, 10.0（高幂次陡峭卖出）
- 快速回撤卖出: fd_thresh(10~25), fd_days(3/5), fd_target(0~0.2)
- 双MA: ma_buy(60/100/120) x ma_sell(150/200/250/300)

**搜索规模:**
- 创业板50 v3: 157,248组参数组合（80核多进程）
- 中证机床 v2: ~30,000组（6种策略类型 x 多维网格）
- 中证科技: 890+组

### 3.2 美股SP500搜索空间（sweep_sp500_voltarget_ext.py）【历史档案: 2009-08-01起点样本搜索, 2026-09-01已按1990起点重搜并更新定稿参数, 本节仅作存档】

**波动率目标搜索（无杠杆 max_pos=1.0）:**

| 维度 | 搜索值 |
|------|--------|
| vol_type | dvol, ewma |
| vol_period | 5, 8, 10, 15, 20, 25, 30, 40, 60, 80, 120 |
| target_vol | 0.3, 0.4, 0.5, 0.6, 0.75, 1.0, 1.25, 1.5 |
| ma_trend | 100, 200 |
| pct_guard | 50, 60, 70, 80 |
| trend_cap | 0.0, 0.2, 0.3, 0.5 |

**搜索规模:** 30,000+组，25种策略类型

### 3.3 美股IXIC搜索空间（sweep_ixic_v6.py）【历史档案: 2009-08-01起点样本搜索, 2026-09-01已按1990起点重搜并更新定稿参数, 本节仅作存档】

**条件趋势搜索:**

| 维度 | 搜索值 |
|------|--------|
| ma_buy | 60, 100, 150, 200 |
| ma_sell | 200, 250, 300 |
| buy_line | 5, 10, 15, 20, 25 |
| sell_line | 80, 85, 90, 95 |
| buy_power | 0.3, 0.5, 1.0 |
| sell_power | 1.0, 2.0, 3.0 |
| pct_guard | 50, 60, 70, 80, 85 |
| ma_trend | 60, 100, 150, 200, 250 |
| trend_cap | 0.0, 0.2, 0.3, 0.5 |

**搜索规模:** 234,432组

---

## 四、策略库 - A股7指数31策略（含2个回撤触发卖）

### 4.1 科创50 (000688.SH) — 5策略

数据: kechuang50.csv (降序), 脚本: strategies_sweep_comparison.py
回测起点: 2024-09-20

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | vol_type | 收益% | Sharpe | 回撤% | Calmar | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|----------|-------|--------|-------|--------|------|
| 1 | 宽买极进 | 200 | 200 | 50 | 90 | 0.3 | 2.5 | static | 311.1 | - | - | - | 收益最高，宽买入50% |
| 2 | 锐进Sharpe | 200 | 200 | 25 | 90 | 0.3 | 2.0 | vol20 | 305.7 | 最高 | - | - | vol20动态调整 |
| 3 | 动态中位 | 200 | 200 | 25 | 90 | 0.5 | 2.0 | vol30 | 266.2 | - | - | - | vol30动态，中位买入 |
| 4 | 均衡进取 | 150 | 150 | 10 | 85 | 0.3 | 1.5 | static | 224.5 | - | - | - | MA150，窄买温和卖 |
| 5 | 极致回撤 | 200 | 200 | 10 | 75 | 1.0 | 1.0 | static | 190.8 | - | -3.4 | 24.41 | 回撤最小，Calmar最高 |
| BH | 买入持有 | - | - | - | - | - | - | - | 161.2 | - | - | - | 基准 |

全部5策略跑赢BH。命名规则: [买入特征]+[卖出/目标特征]。

### 4.2 创业板50 (399673.SZ) — 4策略

数据: idx_399673.csv, 脚本: generate_cyb50_strategy_chart.py
来源: sweep_399673_v3.py 157248组非支配前沿
注意: 此指数vol_scale有clip限制 min(max(scale,0.5),3.0)

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | vol_type | 收益% | Sharpe | 回撤% | Calmar | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|----------|-------|--------|-------|--------|------|
| 1 | 极致收益 | 200 | 200 | 15 | 90 | 0.3 | 0.3 | static | 219.2 | 2.80 | -7.7 | 12.97 | sell_power=0.3极温和卖出 |
| 2 | 均衡Calmar | 200 | 200 | 15 | 90 | 0.3 | 0.5 | static | 210.1 | 2.84 | -5.0 | 19.27 | Calmar最优，回撤仅-5% |
| 3 | 稳健进取 | 150 | 200 | 10 | 90 | 0.7 | 0.5 | vol30 | 155.9 | 3.10 | -5.0 | 14.72 | 双MA+vol30，Sharpe最高 |
| 4 | 锐进Sharpe | 100 | 200 | 5 | 85 | 0.3 | 0.5 | static | 140.7 | 3.16 | -5.0 | 13.93 | 双MA(100买/200卖) |
| BH | 买入持有 | - | - | - | - | - | - | - | 133.6 | - | - | - | 基准 |

全部4策略跑赢BH。核心发现: sell_power主导收益，0.3->0.5->1.0使收益从241%->231%->145%。

### 4.3 中证科技 (931186.CSI) - 4策略

数据: csi_tech_931186.csv, 脚本: csi_tech_strategies_comparison.py
来源: 890+组搜索

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | vol_type | 收益% | Sharpe | 回撤% | Calmar | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|----------|-------|--------|-------|--------|------|
| 1 | 宽买锐进 | 200 | 200 | 30 | 90 | 0.3 | 2.5 | vol20 | 197.5 | 2.89 | -8.9 | 9.54 | 收益最高，vol20动态 |
| 3 | 双MA进取 | 60 | 200 | 15 | 85 | 0.3 | 3.0 | static | 177.1 | 2.87 | -8.8 | 8.79 | MA60买/MA200卖 |
| 4 | 宽买稳卖 | 300 | 300 | 25 | 70 | 0.3 | 3.0 | static | 157.4 | 2.68 | -7.7 | 9.06 | MA300长周期 |
| 5 | 中买均衡 | 60 | 60 | 15 | 80 | 0.5 | 2.5 | vol20 | 128.7 | 2.90 | -5.4 | 11.01 | MA60+vol20 |
| BH | 买入持有 | - | - | - | - | - | - | - | 101.6 | 1.41 | -20.9 | 2.31 | 基准 |

涨势中（dd=0%）power=15极温和持有；回撤8%时power=7加速卖出；回撤15%+时power≈0.1近乎清仓。
### 4.4 CS人工智能 (930713.CSI) - 5策略（含回撤触发卖）

数据: idx_930713.csv, 脚本: generate_sector_strategy_charts.py

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | vol_type | 收益% | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|----------|-------|------|
| 1 | 极致收益 | 200 | 200 | 40 | 85 | 0.3 | 3.0 | vol20 | 330.0 | 宽买入40%，收益最高 |
| 2 | 均衡进取 | 200 | 200 | 20 | 85 | 0.3 | 3.0 | vol20 | 253.6 | 中等买入20% |
| 5 | 回撤触发卖 | 200 | 200 | 20 | 85 | 0.3 | dd(2,50,30) | vol20 | 241.7 | Sharpe 2.94，回撤-11.1%，Calmar 8.99 | dd_th=2, base_sl=50, sens=30, power=12 |
| 4 | 中买均衡 | 200 | 200 | 15 | 85 | 0.5 | 3.0 | vol20 | 223.7 | buy_power=0.5更温和 |
| 5 | 锐进Sharpe | 200 | 200 | 10 | 85 | 0.3 | 3.0 | vol20 | 220.8 | 窄买入10% |
| BH | 买入持有 | - | - | - | - | - | - | - | 182.0 | 基准 |

回撤触发卖: dd<2%时不卖(sl=100), 超过后sl=max(50, 100-30×(dd-2)), power=12。
此指数参数较温和(max_power=5)，涨势中适度持有，回撤5%以上即加速卖出。
全部5策略跑赢BH。
### 4.5 中证半导体 (H30184.CSI) - 4策略

数据: idx_H30184.csv, 脚本: generate_sector_strategy_charts.py

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | vol_type | 收益% | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|----------|-------|------|
| 2 | 极致收益 | 250 | 250 | 20 | 85 | 0.3 | 3.0 | vol20 | 314.5 | MA250，原收益最高 |
| 3 | 均衡进取 | 250 | 250 | 20 | 85 | 0.5 | 3.0 | vol20 | 269.2 | buy_power=0.5更温和 |
| 4 | 锐进Sharpe | 200 | 200 | 15 | 85 | 0.3 | 3.0 | vol20 | 256.5 | MA200，窄买入15% |
| 5 | 稳健低仓 | 200 | 200 | 15 | 70 | 0.3 | 1.5 | vol20 | 207.3 | 低卖线70%+低sell_power |
| BH | 买入持有 | - | - | - | - | - | - | - | 232.1 | 基准 |

### 4.6 中证机床 (931866.CSI) - 5策略（含回撤触发卖）

数据: idx_931866.csv, 脚本: generate_sector_strategy_charts.py
来源: sweep_931866_v2.py ~30000组 + 回撤触发卖调参

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | vol_type | hard_sell | 收益% | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|----------|-----------|-------|------|
| 5 | 回撤触发卖 | 100 | 200 | 15 | 75 | 0.3 | dd(3,50,15) | vol20 | - | 196.1 | Sharpe 2.95，回撤-7.7%，Calmar 10.87 | dd_th=3, base_sl=50, sens=15, power=5 |
| 2 | 宽买锐进 | 120 | 120 | 30 | 85 | 0.3 | 3.0 | vol30 | - | 201.6 | MA120+vol30，宽买入30% |
| 3 | 双MA稳卖 | 100 | 200 | 15 | 75 | 0.3 | 5.0 | vol20 | - | 193.9 | MA100买/MA200卖，sell_power=5.0 |
| 4 | 硬止盈均衡 | 150 | 150 | 15 | 75 | 0.3 | 2.5 | vol20 | 90 | 144.0 | 硬止盈90%清仓 |
| 5 | 中买稳卖 | 150 | 150 | 20 | 70 | 0.3 | 3.0 | vol30 | - | 137.3 | 低卖线70% |
| BH | 买入持有 | - | - | - | - | - | - | - | - | 146.1 | 基准 |

回撤触发卖: dd<3%时不卖(sl=100), 超过后sl=max(50, 100-15×(dd-3)), power=5。双MA(MA100买/MA200卖)。
此指数slope=0.05极平缓，需回撤300%才到floor，实际效果是涨势中power≈15极温和持有。
与双MA稳卖(固定power=5.0)对比: 收益+18%，Sharpe+0.31，说明动态幂优于固定高幂。
### 4.7 机器人产业 (980022.SZ) — 4策略

数据: idx_980022.csv, 脚本: generate_sector_strategy_charts.py

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | vol_type | 收益% | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|----------|-------|------|
| 1 | 锐进Sharpe | 150 | 150 | 20 | 70 | 0.3 | 3.0 | vol30 | 101.0 | MA150+vol30 |
| 2 | 均衡进取 | 60 | 60 | 20 | 70 | 0.3 | 3.0 | static | 95.1 | MA60静态，短周期信号 |
| 3 | 极致收益 | 250 | 250 | 25 | 75 | 0.3 | 3.0 | vol30 | 73.6 | MA250+vol30 |
| 4 | 稳健Calmar | 300 | 300 | 5 | 70 | 1.0 | 3.0 | vol20 | 54.1 | MA300，窄买入5%，与BH持平 |
| BH | 买入持有 | - | - | - | - | - | - | - | 56.4 | 基准 |

3策略跑赢BH，稳健Calmar与BH持平。此指数波动较大，sell_line普遍较低(70~75%)。

---

---

## 五、策略库 - 美股2指数8策略

### 5.1 SP500 (.INX) - 4策略（波动率目标）

数据: sp500/data/sp500_close_real.csv (akshare真实日线)
回测起点: 2009-08-01
脚本: generate_us_strategy_charts.py

| # | 策略名 | vol_type | vol_period | target_vol | ma_trend | pct_guard | trend_cap | 收益% | 特点 |
|---|--------|----------|------------|------------|----------|-----------|-----------|-------|------|
| 1 | dvol锐进 | dvol | 5 | 3.0 | 200 | 70 | 0.0 | ~760 | 5日标准差，高目标波动=高仓位 |
| 2 | ewma均衡 | ewma | 5 | 1.5 | 200 | 70 | 0.0 | ~650 | 5日EWMA，中等目标 |
| 3 | ewma稳进 | ewma | 5 | 1.25 | 200 | 80 | 0.0 | ~550 | 更低目标+更严过滤(pct_guard=80) |
| 4 | dvol极致回撤 | dvol | 10 | 0.75 | 200 | 70 | 0.0 | ~400 | 10日标准差，极低目标=低仓位 |
| BH | 买入持有 | - | - | - | - | - | - | ~639 | 基准 |

核心逻辑: position = min(1.0, target_vol / current_vol)
趋势过滤: close < MA200 且 pct60 > pct_guard 时清仓 (trend_cap=0.0)
最优无杠杆: vol_ewma(5, 1.5, MA200, guard70, cap0) 收益760% Sharpe0.94
注意: 旧sp500_close.csv是插值假日线不可用于策略回测，必须用sp500_close_real.csv

### 5.2 IXIC (纳斯达克综合) — 4策略（条件趋势）

数据: idx_ixic.csv
回测起点: 2009-08-01
搜索规模: 234,432组

| # | 策略名 | ma_buy | ma_sell | buy_line | sell_line | buy_power | sell_power | pct_guard | ma_trend | trend_cap | 收益% | 特点 |
|---|--------|--------|---------|----------|-----------|-----------|------------|-----------|----------|-----------|-------|------|
| 1 | 条件趋势收益 | 60 | 300 | 20 | 90 | 0.3 | 3.0 | 70 | 100 | 0.0 | 最高 | MA60买/MA300卖，pct_guard=70 |
| 2 | 条件趋势Sharpe | 60 | 300 | 20 | 90 | 0.3 | 3.0 | 50 | 100 | 0.0 | 次高 | 同上但pct_guard=50(更早触发趋势过滤) |
| 3 | 条件趋势Calmar | 60 | 300 | 15 | 90 | 0.3 | 3.0 | 70 | 100 | 0.0 | - | 窄买入15%，Calmar最优 |
| 4 | 条件趋势回撤 | 60 | 300 | 20 | 90 | 0.5 | 3.0 | 70 | 100 | 0.0 | - | buy_power=0.5更温和买入 |

全部使用双MA(60买/300卖) + MA100趋势过滤 + sell_power=3.0
核心: 短期MA60百分位抓买点，长期MA300百分位判卖点，MA100做趋势过滤

---

---

## 五b、策略库 - 黄金5策略（4类信号维度）

### 5.0 黄金 (SGE Au99.99) - 5策略（MA百分位+ROC动量+BB突破+波动率目标）

数据: idx_gold.csv (akshare spot_hist_sge Au99.99)
回测起点: 2024-09-20
脚本: generate_gold_strategy_chart.py
搜索规模: 4481组非MA类 + 7109组MA类

| # | 策略名 | 类型 | 参数 | 收益% | Sharpe | 回撤% | Calmar | 末仓% | 特点 |
|---|--------|------|------|-------|--------|-------|--------|-------|------|
| 1 | ROC动量 | ROC | period30, thresh=-2% | 86.8 | 1.82 | -17.1 | 2.41 | 100 | 收益最高, 30日ROC>-2%持仓 |
| 2 | 宽买稳卖 | MA百分位 | ma250, bl50/sl85, bp0.3/sp0.3 | 81.2 | 2.32 | -17.0 | 2.29 | 100 | Sharpe最高, 宽买入稳卖出 |
| 3 | 极致Calmar | MA百分位 | ma300, bl30/sl90, bp0.3/sp0.3 | 76.4 | 2.23 | -16.1 | 2.29 | 100 | 回撤最小, 长周期MA |
| 4 | BB突破 | 布林带 | period25, std=2.5 | 62.1 | 1.46 | -17.1 | 1.79 | 100 | 突破上轨买, 跌破下轨卖 |
| 5 | ewma低波 | 波动率目标 | ewma5, tv0.5, ma200, pg50 | 38.3 | 1.75 | -16.6 | 1.18 | 51 | 平均仓位58%, 极致风控 |
| BH | 买入持有 | - | - | 60.6 | 1.21 | -30.1 | - | 100 | 基准 |

4个策略跑赢BH。黄金是强趋势市场, 策略核心价值在风控(回撤-17% vs BH -30%)。

**ROC策略逻辑**: 30日收益率(ROC) > -2% 满仓, 否则空仓。只要30日跌幅不超过2%就持有, 跌破即离场。趋势跟踪类, 非均值回归。

**BB突破逻辑**: 25日布林带(2.5σ), 收盘价突破上轨买入, 跌破下轨卖出。与Donchian通道突破信号高度趋同。

**策略搜索结论(4481组)**:
- 趋势跟踪类(ROC/BB突破/DC突破)全面胜出, Top 15全部是趋势策略, 回撤一致-17.1%
- RSI均值回归完全失效(最高仅26.8%), 强趋势市场均值回归是错误方向
- MA交叉收益接近BH但回撤-25.6%远大于趋势策略-17.1%
- 条件趋势(百分位+趋势过滤)收益过低(8.2%), 过于保守
- 波动率目标策略Sharpe高(1.75)但收益低(38.3%), 低仓位高Sharpe特征

**非MA类策略回测引擎**:
- ROC: position = 1.0 if roc > threshold else 0.0 (二值仓位)
- BB突破: position = 1.0 if close > upper else 0.0 if close < lower (二值仓位)
- 均使用T+1执行: strat_ret = ret * pos.shift(1), nav = (1+strat_ret).cumprod()

---

## 五c、SP500与IXIC交叉借鉴测试（2026-08-13，负结果存档）

交叉测试脚本: cross_test_sp500_ixic.py | 无杠杆 T+1 | 2009-08-01起

A) 条件趋势(原IXIC框架)→SP500: 21.6万组, Top收益709.9%(仅超BH 25pct, 回撤-33.8%无改善); Top Sharpe 0.96/回撤-23.7%但收益577%低于BH 684.7% → 提升有限, 不采用
B) 波动率目标(原SP500框架)→IXIC: 7260组, Top收益1427.7%(超BH 184pct, 但回撤-33.4%远差于IXIC现有条件趋势-22.9%); 防御变体dvol5/tv1.25 Calmar0.70/回撤-22.6%但收益落后 → 打平不超越, 不采用
C) ROC动量(黄金最优类型)→两指数: SP500最高511.4%/IXIC最高840.9%, 双双大幅跑输BH → 强趋势策略只适用于黄金这类单边趋势市场, 美股震荡上行失效

结论: 各指数原生框架仍是最优(SP500波动率目标/IXIC条件趋势), 交叉借鉴无增益。防御变体候选(未入池): IXIC dvol5/tv1.25/guard70/cap0, SP500 cond_trend(200,300,5,85,0.3,3.0,70,60,0.0)。

---

## 六、跨指数规律总结

### 6.1 sell_power 是最核心参数

| 现象 | sell_power | 效果 |
|------|-----------|------|
| 仓位锁死（卖出后无法重建） | 2.0~3.0 | 收益被压低，需要降幂次 |
| 创业板50: 降幂次 | 1.0->0.5->0.3 | 收益 145%->231%->241% |
| 顶部大回撤 | 1.0~2.0 | 回撤过大，需要升幂次 |
| 中证机床: 升幂次 | 3.0->5.0 | 回撤 -19.3%->-7.2% |
| 最优区间 | 0.3~5.0 | 因指数而异，需搜索 |

机制: sell_power越小，卖出越温和（保留更多仓位）；sell_power越大，卖出越陡峭（快速清仓）。

### 6.2 buy_power 通用规律

- 0.3 = 激进买入（低偏离度时迅速满仓）
- 0.5 = 均衡买入
- 1.0 = 线性买入（保守）
- 几乎所有指数最优策略的buy_power都是0.3

### 6.3 MA周期选择

- MA200: 最通用，科创50/创业板50/CS人工智能/中证半导体均使用
- MA150: 中证机床/机器人产业偏好
- MA300: 中证科技"宽买稳卖"使用，长周期更平稳
- MA60: 仅作为双MA的买入信号（短期敏感）
- 双MA(短买长卖): 提升Sharpe，中证科技/创业板50/中证机床/IXIC均验证

### 6.4 vol_type 选择

- vol20: 适合波动适中的指数（科创50/中证科技/CS人工智能/中证半导体）
- vol30: 适合波动较大的指数（创业板50/中证机床/机器人产业）
- static: 适合波动极大的指数或短回测区间

### 6.5 buy_line 与收益的关系

CS人工智能的对照实验最清晰（其他参数全同）：
- buy_line=40 -> 332.0%（最高收益）
- buy_line=20 -> 255.8%
- buy_line=15 -> 232.3%
- buy_line=10 -> 220.7%
规律: buy_line越高（越早建仓），收益越高，但回撤也越大。

### 6.6 跑输BH的策略特征

31策略中4个跑输BH，共同特征：
1. sell_line过低(70%) + sell_power过低(1.5) -> 过早卖出且卖出不够彻底
2. buy_line过低(5~15%) + buy_power过高(1.0) -> 买入太保守
3. MA周期过长(300) + 窄买入(5%) -> 信号太少，长期空仓

### 6.7 rebuy_mode

- rebuy_mode=0 (max约束): 买入时 target = max(position, new_target)，最优
- rebuy_mode=1 (绝对目标): 买入时 target = new_target，被全面支配

### 6.8 被验证无效的方向

- RSI指标: 对中证科技无效
- 动量指标: 对中证科技无效
- expanding漂移百分位: 全部失败（pool必须用固定回测区间）
- 硬止盈: 仅中证机床有一定效果，其他指数不如动态卖出

---

## 七、新指数策略研究流程（SOP）

对一个新的A股指数做最优策略研究，按以下步骤操作：

### 步骤1: 数据准备
```
1. Tushare获取日线数据: pro.index_daily(ts_code='XXXXXX.XX')
2. 存为 idx_XXXXXX.csv，列: trade_date, close
3. 确认数据完整性（无缺失交易日）
```

### 步骤2: 信号计算
```python
MA_LIST = [60, 100, 120, 150, 200, 250, 300]
for ma_p in MA_LIST:
    df[f'ma{ma_p}'] = df['close'].rolling(ma_p).mean()
    df[f'dev{ma_p}'] = (df['close'] / df[f'ma{ma_p}'] - 1) * 100
    # 百分位池: 仅回测区间
    pool = df.loc['2024-09-20':, f'dev{ma_p}'].dropna().values
    df[f'pct{ma_p}'] = df[f'dev{ma_p}'].apply(
        lambda x: percentileofscore(pool, x) if not np.isnan(x) else np.nan)
    # 波动率
    df[f'vol20_{ma_p}'] = df[f'dev{ma_p}'].rolling(20).std()
    df[f'vol30_{ma_p}'] = df[f'dev{ma_p}'].rolling(30).std()
```

### 步骤3: 参数网格搜索
```python
# 搜索空间（推荐起点）
for ma_buy in [60, 100, 120, 150, 200, 250]:
    for ma_sell in [ma_buy, 200, 250, 300]:  # 单MA + 双MA
        for vol_type in ['static', 'vol20', 'vol30']:
            for buy_line in [5, 10, 15, 20, 25, 30, 40, 50]:
                for sell_line in [70, 75, 80, 85, 90]:
                    for buy_power in [0.3, 0.5, 0.7, 1.0]:
                        for sell_power in [0.3, 0.5, 1.0, 1.5, 2.0, 3.0, 5.0]:
                            # 回测 + 记录结果
```

### 步骤4: 非支配筛选
```python
# 4个维度: 收益(最大), Sharpe(最大), 回撤(最小), Calmar(最大)
# 去除被支配的策略: 如果A在所有维度都不劣于B且至少一个维度优于B，则B被支配
```

### 步骤5: 选择4~5个策略
- 收益最优1个
- Sharpe最优1个
- Calmar最优1个
- 综合均衡1~2个
- 确保每个策略至少有1个维度是最优的（非支配前沿上）

### 步骤6: 写入strategy_config.json
```json
{
    "name": "新指数名",
    "code": "XXXXXX.XX",
    "csv": "idx_XXXXXX.csv",
    "base_color": "#XXXXXX",
    "source_script": "generate_xxx.py",
    "strategies": [
        {"name": "策略1", "ma_buy": 200, "ma_sell": 200, "buy_line": 30, ...}
    ]
}
```

### 步骤7: 验证
```bash
# 运行汇总图确认新指数被正确读取
python3 a_share_summary.py
# 检查新指数策略图
python3 generate_xxx.py
```

---

## 八、文件索引

### 策略图生成脚本
| 脚本 | 指数 | 策略数 |
|------|------|--------|
| strategies_sweep_comparison.py | 科创50 | 5 |
| csi_tech_strategies_comparison.py | 中证科技 | 4 |
| generate_cyb50_strategy_chart.py | 创业板50 | 4 |
| generate_sector_strategy_charts.py | CS人工智能+中证半导体+中证机床+机器人产业 | 4x4=16 |
| generate_us_strategy_charts.py | SP500+IXIC | 4x2=8 |
| a_share_summary.py | A股7指数汇总 | 33 |

### 参数搜索脚本
| 脚本 | 指数 | 搜索规模 |
|------|------|----------|
| sweep_399673_v2.py | 创业板50 | ~30000组(6种策略类型) |
| sweep_399673_v3.py | 创业板50 | 157248组(多进程) |
| sweep_931866_v2.py | 中证机床 | ~30000组(6种策略类型) |
| sweep_sp500_voltarget_ext.py | SP500 | 30000+组 |
| sweep_ixic_v6.py | IXIC | 234432组 |

### 配置文件
| 文件 | 用途 |
|------|------|
| strategy_config.json | A股7指数31策略统一配置(SSOT) |
| run_all_a_share_charts.py | A股统一执行脚本(更新数据+生成8张图) |
| update_all_a_share.py | 7指数Tushare数据更新 |
| update_us_data.py | 美股数据更新(akshare) |

### 数据文件
| 文件 | 指数 | 数据源 |
|------|------|--------|
| kechuang50.csv | 科创50 | Tushare (降序) |
| idx_399673.csv | 创业板50 | Tushare |
| csi_tech_931186.csv | 中证科技 | Tushare |
| idx_930713.csv | CS人工智能 | Tushare |
| idx_H30184.csv | 中证半导体 | Tushare |
| idx_931866.csv | 中证机床 | Tushare |
| idx_980022.csv | 机器人产业 | Tushare |
| sp500/data/sp500_close_real.csv | SP500 | akshare |
| idx_ixic.csv | IXIC | akshare |

---

## 九、配色方案

### A股各指数基础色（汇总图用）
| 指数 | base_color | RGB |
|------|-----------|-----|
| 科创50 | #1565C0 | 蓝 |
| 创业板50 | #FF8F00 | 橙 |
| 中证科技 | #6A1B9A | 紫 |
| CS人工智能 | #00838F | 青 |
| 中证半导体 | #AD1457 | 粉红 |
| 中证机床 | #5D4037 | 棕 |
| 机器人产业 | #4527A0 | 深紫 |

### 汇总图同色系渐变规则
同一指数内不同策略按收益率排名：
- #1(最高收益) = base_color原色
- #2 = base_color + 20%白色混合
- #3 = base_color + 40%白色混合
- #4 = base_color + 60%白色混合
- #5 = base_color + 80%白色混合

### 单指数策略图配色（5色固定方案）
| 顺序 | 颜色 | RGB | 用途 |
|------|------|-----|------|
| 1 | 深橙红 | #BF360C | 收益最优 |
| 2 | 蓝 | #1565C0 | Sharpe最优 |
| 3 | 绿 | #2E7D32 | Calmar/均衡 |
| 4 | 橙 | #FF8F00 | 进取型 |
| 5 | 紫 | #6A1B9A | 回撤最优 |

---

## 十、定时任务

| 时间 | 任务 | job_id | 内容 |
|------|------|--------|------|
| 09:30(美股交易日) | 美股晨报 | 2129beb6a11d | 5张图: SP500策略+IXIC策略+5-ave+轮动算法+KDE |
| 20:30(A股交易日) | A股策略图 | b61e55ba1377 | 8张图: 7指数策略图+汇总图 |
| 月度 | 参数网格搜索提醒 | 098df25fafa5 | 提醒重新搜索最优参数 |

---

## 附录: 策略命名规范

格式: [买入特征] + [卖出/目标特征]

**买入特征词:**
- 宽买: buy_line >= 30 (宽买入区间，早建仓)
- 中买: buy_line 15~25 (中等买入区间)
- 窄买/锐进: buy_line <= 15 (窄买入区间，深跌才买)
- 双MA: ma_buy != ma_sell (短期MA买入)

**卖出/目标特征词:**
- 极进: sell_power >= 2.5 (激进卖出)
- 进取: sell_power 1.5~2.5
- 均衡: sell_power 0.5~1.5
- 稳卖/稳进: sell_line <= 75 或 sell_power <= 0.5 (温和卖出)
- 极致回撤: 回撤最小化优先
- 极致收益: 收益最大化优先
- 硬止盈: 使用hard_sell参数

**命名示例:**
- "宽买极进" = buy_line=50(宽买入) + sell_power=2.5(激进卖出)
- "双MA稳卖" = 双MA信号 + sell_line=75(低卖线温和卖出)
- "均衡Calmar" = 中等参数 + Calmar比率最优

---

## 十一、图表布局规范

### 11.1 单指数策略图（6面板）

所有单指数策略图统一使用6面板布局，height_ratios=[2.8, 2.2, 1.8, 2.0, 2.0, 2.0]：

Panel 0: 策略总览表
- 列: 策略名 / 逻辑描述 / 收益% / Sharpe / 回撤% / Calmar / 均仓% / 末仓%
- 各维度最优值黄底加粗(#FFF59D)
- 策略名单元格用策略配色填充，白字加粗
- 末行加买入持有基准

Panel 1: NAV净值曲线
- 灰色虚线=买入持有，彩色实线=各策略
- 右侧标注总收益率
- 图例含买卖参数摘要

Panel 2: 仓位曲线
- y轴0~100%，右侧标注末仓%
- 底部0~20%绿色淡底，85~100%红色淡底

Panel 3: 信号A（静态）
- 偏离度百分位曲线 + buy_line/sell_line水平线
- 或偏离度原始值+MA均线

Panel 4: 信号B（动态）
- 波动率曲线 + vol_median水平线
- 或趋势过滤触发区域（橙色填充）
- 必须有内容，不能空白

Panel 5: 回撤曲线
- 各策略回撤，三角形标注最大回撤点
- 箭头注释策略名+回撤值

### 11.2 美股策略图额外规范

- 表格多一列"2022回撤%"（红色阴影标注2022熊市区间）
- Panel 1收盘价图加MA60/MA100/MA200/MA300均线
- SP500信号面板: 波动率曲线 + target_vol水平线 + 趋势过滤触发区域
- IXIC信号面板: pct60+pct300双百分位 + buy_line/sell_line + 趋势过滤区域

### 11.3 汇总图（4面板）

Panel 0: 策略汇总表
- 每行一个策略，按指数分组
- 指数名列底色用base_color
- 列: 指数 / 策略 / 收益% / Sharpe / 回撤% / Calmar / 末仓%

Panel 1: 全部策略NAV对比
- 每条线一个策略，同指数同色系（收益越高颜色越深）
- 灰色虚线=各指数BH

Panel 2: 各指数#1策略NAV
- 每个指数只画收益最高的策略
- 右侧标注收益%

Panel 3: 收益vs回撤散点图
- x轴=最大回撤%，y轴=总收益%
- 每点一个策略，颜色=指数base_color
- 标注策略名

### 11.4 字体与中文显示

- 字体: NotoSansCJKSC-Regular.ttf
- 路径: /usr/share/fonts/truetype/NotoSansCJKSC-Regular.ttf
- 设置: plt.rcParams['axes.unicode_minus'] = False
- 图表标题/轴标签/图例/注释全部用fontproperties=font
- 图表尺寸: 单指数20x28英寸，汇总图22x28英寸，dpi=150

### 11.5 图表输出路径

- 科创50: strategies_sweep_comparison.png
- 中证科技: csi_tech_strategies_comparison.png
- 创业板50: strategy_399673.png
- CS人工智能: strategy_930713.png
- 中证半导体: strategy_H30184.png
- 中证机床: strategy_931866.png
- 机器人产业: strategy_980022.png
- A股汇总: a_share_strategy_summary.png
- SP500: strategy_sp500_real.png
- IXIC: strategy_ixic_v6.png
- 全部输出到: /mnt/c/Users/Administrator/quant/

---

## 十二、数据源规范

### 12.1 A股数据

- 数据源: Tushare pro_api
- 获取: pro.index_daily(ts_code='XXXXXX.XX', start_date='20200101', end_date='today')
- 存储格式: CSV，列: trade_date, close (升序)
- 科创50特殊: kechuang50.csv 为降序存储（历史遗留，脚本内sort_values处理）
- 更新脚本: update_all_a_share.py（7个指数一次性更新）
- 百分位pool: 仅回测区间(2024-09-20起)的dev值，不用expanding

### 12.2 美股数据

- 数据源: akshare
- SP500: akshare index_us_stock_sina('.INX'), 存 sp500/data/sp500_close_real.csv
- IXIC: akshare获取, 存 idx_ixic.csv
- ⚠️ 旧sp500_close.csv是插值假日线，不可用于策略回测，必须用sp500_close_real.csv
- 更新脚本: update_us_data.py

### 12.3 数据新鲜度检查清单

每次推送前检查尾行日期:
- sp500/data/sp500_close_real.csv (或 sp500_close.csv)
- sp500/data/pe.csv
- multpl_cape.csv
- us_bond_10y.csv
- fed_funds_rate.csv (Fed Funds晚1天)
- shiller_pe_daily.csv 已废弃
- A股各idx_*.csv / kechuang50.csv

时间差: 北京时间 = 美东时间 + 12小时

### 12.4 回测起点

- A股: 2024-09-20 (pool_start = bt_start = 2024-09-20)
- 美股: 2009-08-01
- 美股周六有报告: 美股周五晚到周六凌晨交易，北京周六早上可获取周五收盘数据

---

## 十三、回测引擎版本差异

### 13.1 版本对照

| 脚本 | 引擎特点 | 差异点 |
|------|----------|--------|
| strategies_sweep_comparison.py | 基础版 | 单MA, 无双MA, 无硬止盈 |
| csi_tech_strategies_comparison.py | 双MA版 | 支持backtest_dual(), 买入用sig_buy卖出用sig_sell |
| generate_cyb50_strategy_chart.py | vol_clip版 | scale=min(max(vol/med,0.5),3.0), 限制缩放范围 |
| generate_sector_strategy_charts.py | 完整版 | 支持双MA+硬止盈+动态波动率, 最通用 |
| generate_us_strategy_charts.py | 美股版 | SP500波动率目标, IXIC条件趋势+趋势过滤+dd_stop |
| a_share_summary.py | 汇总版 | 统一引擎, 从strategy_config.json读取参数 |

### 13.2 各版本关键差异

**双MA实现差异:**
- 中证科技: 独立backtest_dual()函数，先判买再判卖
- 创业板50/行业指数: 统一backtest()函数，先判卖再判买（卖出优先）
- 优先级不同可能影响边界情况结果

**vol_scale差异:**
- 大部分脚本: scale = vol / vol_median（无限制）
- 创业板50: scale = min(max(vol / vol_median, 0.5), 3.0)（限制0.5~3.0）
- 行业指数: scale = vol / vol_median（无限制）

**硬止盈实现:**
- 仅generate_sector_strategy_charts.py支持
- sig_sell > hard_sell 时 target = min(position, hard_sell_target)
- 优先级: 硬止盈 > 卖出 > 买入

**美股SP500特有:**
- position = min(max_pos, target_vol / v)，直接设定仓位（非max/min约束）
- 趋势过滤: close < MA200 且 pct60 > guard 时 position = min(position, trend_cap)
- 无买入单调约束（直接覆盖position）

**美股IXIC特有:**
- 有趋势过滤: close < MA_trend 且 pct_buy > pct_guard 时清仓
- 有dd_stop参数: nav回撤超过dd_stop%时清仓（实际未使用，默认100）

### 13.3 统一引擎注意事项

a_share_summary.py的统一引擎需要兼容所有变体:
1. 单MA: ma_buy == ma_sell, 用backtest()
2. 双MA: ma_buy != ma_sell, 买入用pct[ma_buy]卖出用pct[ma_sell]
3. 硬止盈: hard_sell < 100时启用
4. 动态波动率: vol_type != null时启用
5. 注意: 统一引擎卖出优先于买入（与行业指数脚本一致）
6. 注意: 统一引擎vol_scale无clip限制（与科创50/中证科技一致，与创业板50有差异）

---

## 十四、strategy_config.json 使用规范

### 14.1 文件结构

```json
{
  "_说明": "说明文字",
  "_字段": { "字段名": "说明" },
  "bt_start": "2024-09-20",
  "pool_start": "2024-09-20",
  "indices": [
    {
      "name": "指数名",
      "code": "Tushare代码",
      "csv": "数据文件名",
      "base_color": "#XXXXXX",
      "source_script": "来源脚本",
      "strategies": [
        {
          "name": "策略名",
          "ma_buy": 200,
          "ma_sell": 200,
          "buy_line": 30,
          "sell_line": 90,
          "buy_power": 0.3,
          "sell_power": 2.5,
          "vol_type": null,
          "hard_sell": 100,
          "hard_sell_target": 0.0
        }
      ]
    }
  ]
}
```

### 14.2 字段说明

- ma_buy: 买入信号使用的MA周期
- ma_sell: 卖出信号使用的MA周期（等于ma_buy则为单MA）
- buy_line: 买入百分位阈值（pct <= buy_line时触发买入）
- sell_line: 卖出百分位阈值（pct >= sell_line时触发卖出）
- buy_power: 买入幂次（越小买入越激进，0.3=激进，1.0=线性）
- sell_power: 卖出幂次（越小卖出越温和，0.3=极温和，5.0=陡峭）
- vol_type: null=静态, "vol20"=20日波动率, "vol30"=30日波动率
- hard_sell: 硬止盈阈值（默认100=不启用，90=百分位>90%清仓）
- hard_sell_target: 硬止盈后目标仓位（默认0=清仓）

### 14.3 修改流程

1. 修改strategy_config.json中对应指数的策略参数
2. 运行 a_share_summary.py 验证汇总图正确
3. 运行对应单指数脚本验证单图正确
4. 无需修改a_share_summary.py代码（自动从config读取）

### 14.4 新增指数流程

1. 在indices数组末尾添加新指数配置
2. 确保csv文件已存在且格式正确
3. 确保base_color与现有指数不重复
4. 运行a_share_summary.py验证

---

## 十五、飞书推送格式规范

### 15.1 文字报告格式

严格禁止:
- Markdown表格 (| columns |)
- Markdown引用 (> lines)
- 代码块 (```)

必须使用:
- 纯文本bullet list格式
- emoji标题（📊 估值 / 📈 趋势 / 🏆 评分 / 📋 研判）
- 关键指标分行列出
- 评分用紧凑格式「5-ave: 93.5 | 6-ave: 93.6」
- 趋势用「AB->2031-03」

### 15.2 图片发送格式

每张图单独一行，用MEDIA:前缀:
```
MEDIA:/mnt/c/Users/Administrator/quant/strategies_sweep_comparison.png
MEDIA:/mnt/c/Users/Administrator/quant/a_share_strategy_summary.png
```

### 15.3 收盘数据报告要求

- 收盘价必须从CSV精确读取（tail -2），不要取近似值
- 必须包含涨跌额和涨跌幅%
- 格式: 「日期: 收盘价 (涨跌额 / 涨跌幅%)」

### 15.4 定时任务模型

- 定时任务使用 glm-5-2-260617 模型（火山引擎）
- 不能用 deepseek-chat（不支持agent plan功能，报HTTP 404）

---

## 十六、参数搜索实操规范

### 16.1 搜索前准备

1. 确认数据已更新到最新交易日
2. 确认MA_LIST覆盖所有需要测试的周期: [60, 100, 120, 150, 200, 250, 300]
3. 确认pool_start = bt_start = 2024-09-20
4. 确认百分位池只用回测区间数据（不用expanding）

### 16.2 搜索策略类型（6种）

1. 原框架+高卖出幂次: 标准网格，sell_power延伸到3.0~10.0
2. 硬止盈阈值: hard_sell=90/93/95, hard_sell_target=0/0.1/0.2
3. 快速回撤卖出: fd_thresh(10~25), fd_days(3/5), fd_target(0~0.2)
4. 双MA信号: ma_buy(短) x ma_sell(长), 短买长卖
5. 硬止盈+双MA组合: 组合搜索
6. 陡峭卖出公式: sell_power=3.0/5.0/8.0/10.0

### 16.3 搜索后筛选

1. 去除被支配策略（dominance分析）
2. 4维度非支配前沿: 收益(最大) / Sharpe(最大) / 回撤(最小) / Calmar(最大)
3. 选择4~5个策略，确保每个至少有1个维度最优
4. 命名遵循命名规范（第附录节）
5. 写入strategy_config.json

### 16.4 搜索脚本规范

- 多进程: 使用multiprocessing.Pool, 80核加速
- 预提取numpy数组加速（避免DataFrame逐行iloc）
- 输出: 按收益排序Top50 + 非支配前沿
- 日志: 打印每组参数的收益/Sharpe/回撤/Calmar/均仓/末仓

### 16.5 月度重搜索提醒

- cron job 098df25fafa5 每月提醒重新搜索
- 原因: 随着数据更新，最优参数可能变化
- 流程: 重跑sweep脚本 -> 对比现有策略 -> 更新strategy_config.json

---

## 十七、已知陷阱与注意事项

### 17.1 数据陷阱

- kechuang50.csv是降序存储（历史遗留），脚本内必须sort_values('trade_date')
- sp500_close.csv是插值假日线，必须用sp500_close_real.csv
- Tushare当日数据通常在收盘后2~3小时入库（A股15:00收盘，约17:30后可取）
- 周六有美股数据（周五交易，北京周六早上可取）

### 17.2 引擎陷阱

- NAV计算: 先算strat_ret再fillna(0)，不能先fillna再算
- T+1执行: pos.shift(1)，用前一日仓位乘当日收益
- MA必须先在全历史算rolling再filter到回测区间（否则前几个值NaN）
- expanding漂移百分位: 全部失败，不要使用
- ^是异或运算符不是幂运算，幂运算用 **

### 17.3 策略陷阱

- sell_power过低(0.3)可能导致仓位永远锁死在高位（卖出太温和）
- sell_power过高(5.0~10.0)可能导致清仓后无法重建仓位
- buy_line过高(50)可能导致在下跌中段就满仓，后续无资金加仓
- 双MA的优先级: 先判卖出再判买入（行业指数脚本），与先买再卖（中证科技脚本）结果可能不同
- 硬止盈会与正常卖出逻辑冲突，需确保硬止盈优先级最高

### 17.4 图表陷阱

- 中文必须设置fontproperties=font，否则显示方块
- 表格cell.set_text_props(fontproperties=font)必须逐cell设置
- 图例prop=font必须设置
- 注释fontproperties=font必须设置
- 标注不能遮挡核心数据线
- 两条同色系曲线（蓝+青、红+灰）用户会立即指正，必须确保颜色区分度

### 17.5 定时任务陷阱

- 不能用deepseek-chat模型（火山引擎不支持agent plan功能，报HTTP 404）
- 用check_trading_day_hs300.py（A股）或check_trading_day_sp500.py（美股）作为script判断交易日
- 非交易日返回[SILENT]不推送
- A股20:30执行确保Tushare数据已入库
- 美股09:30执行（美东前一日收盘后12小时）

---

## 十八、WSL运行环境规范

### 18.1 Python环境

- Python路径: /root/.hermes/hermes-agent/venv/bin/python3
- Python版本: 3.11.15
- 依赖: pandas, numpy, scipy, matplotlib, tushare, akshare
- 字体: /usr/share/fonts/truetype/NotoSansCJKSC-Regular.ttf

### 18.2 WSL稳定性

- shutdown根因: Microsoft Store自动更新WSL（如2.7.11.0），更新过程强制关闭VM
- 修复1: .wslconfig 设置 vmIdleTimeout=-1（防止空闲关闭）
- 修复2: 注册表 HKLM\SOFTWARE\Policies\Microsoft\WindowsStore\AutoDownload=2（禁止Store自动更新）
- 修复3: Windows计划任务 WSL-KeepAlive 每10分钟检查WSL是否运行，挂了自动重启

### 18.3 文件路径规范

- 量化脚本: /mnt/c/Users/Administrator/quant/ (Windows: C:\Users\Administrator\quant\)
- 数据输出: /mnt/c/Users/Administrator/quant/ (同上)
- Hermes脚本: /root/.hermes/scripts/
- 策略配置: /mnt/c/Users/Administrator/quant/strategy_config.json
- 策略库: /mnt/c/Users/Administrator/quant/strategy_library.md
