# NSPS 周K线量化交易系统 — Function Specification

> Version: 1.0
> Created: 2026-07-30
> Status: Draft

---

## 模块总览

```
weekly-trading-system/
├── weekly_kline_layer.py      # F1: 周K线量化分析
├── probability_engine.py      # F2: 概率决策引擎
├── patient_trading_system.py  # F3: 耐心交易系统
├── clfa_strategy_loop.py      # F4: CLFA策略闭环
├── data/
│   ├── watchlist.json         # 观察名单
│   ├── trades.json            # 交易记录
│   └── weekly_stats.json      # 周度统计
└── tests/
    ├── test_weekly_kline.py
    ├── test_probability.py
    └── test_trading.py
```

---

## F1: weekly_kline_layer.py — 周K线量化分析

### 1.1 函数清单

```python
def get_weekly_ohlcv(symbol: str, market: str = 'US', weeks: int = 104) -> List[Dict]
    """
    从TimescaleDB获取周K线数据
    输入: symbol, market(US/CN), weeks(默认104=2年)
    输出: [{date, open, high, low, close, volume}, ...]
    逻辑: 将日线数据resample为周线(周五收盘)
    """

def detect_weekly_patterns(weekly_data: List[Dict]) -> Dict
    """
    识别周K线形态
    输入: 周K线数据
    输出: {
        "hammer": bool,           # 锤子线
        "engulfing": bool,        # 吞没形态
        "morning_star": bool,     # 早晨之星
        "three_white": bool,      # 三连阳
        "long_upper_shadow": bool, # 长上影线
        "pattern_name": str,      # 当前形态名称
        "signal": str             # BULLISH/BEARISH/NEUTRAL
    }
    """

def calculate_weekly_indicators(weekly_data: List[Dict]) -> Dict
    """
    计算周线技术指标
    输出: {
        "macd": {"value": float, "signal": float, "histogram": float, "cross": "golden"/"death"/None},
        "rsi": float,              # 14周RSI
        "bollinger": {"upper": float, "middle": float, "lower": float, "position": "above_upper"/"below_lower"/"within"},
        "ma_alignment": bool,      # 5>10>20>50周MA多头排列
        "ma50_slope": float,       # 50周MA斜率(正=上升)
        "above_ma50": bool         # 当前价格是否在50周MA上方
    }
    """

def detect_weekly_wave_phase(weekly_data: List[Dict]) -> Dict
    """
    用周线判断Elliott波浪阶段
    输出: {
        "phase": "wave_1"/"wave_2"/"wave_3"/"wave_4"/"wave_5"/"unknown",
        "confidence": float,       # 0-1
        "details": str             # 描述
    }
    """

def calculate_support_resistance(weekly_data: List[Dict]) -> Dict
    """
    计算周线支撑/阻力位
    输出: {
        "resistance_levels": [float, ...],  # 阻力位列表
        "support_levels": [float, ...],     # 支撑位列表
        "fibonacci": {"382": float, "500": float, "618": float},
        "52w_high": float,
        "52w_low": float,
        "distance_to_resistance": float,    # 距最近阻力位%
        "distance_to_support": float        # 距最近支撑位%
    }
    """

def calculate_relative_strength(symbol: str, market: str = 'US', weeks: int = 26) -> float
    """
    计算相对强度排名(RS)
    逻辑: 过去26周涨幅在全市场排名
    输出: 0-100的百分位数(90=前10%)
    """

def weekly_kline_analysis(symbol: str, market: str = 'US') -> Dict
    """
    主入口:完整周K线分析
    输出: {
        "symbol": str,
        "market": str,
        "timestamp": str,
        "patterns": Dict,          # from detect_weekly_patterns
        "indicators": Dict,        # from calculate_weekly_indicators
        "wave_phase": Dict,        # from detect_weekly_wave_phase
        "support_resistance": Dict, # from calculate_support_resistance
        "relative_strength": float, # from calculate_relative_strength
        "composite_score": float,   # 0-100综合评分
        "signal": str              # STRONG_BUY/BUY/HOLD/SELL/STRONG_SELL
    }
    """
```

### 1.2 数据流

```
TimescaleDB (日线) 
    → resample为周线
    → 形态识别 + 技术指标 + 波浪位置 + 支撑阻力 + RS
    → 综合评分
    → 输出信号
```

### 1.3 依赖

- `db_utils.py` — 数据库连接
- `numpy` — 数值计算
- 无外部API依赖(纯本地计算)

---

## F2: probability_engine.py — 概率决策引擎

### 2.1 函数清单

```python
def calculate_expected_value(win_rate: float, avg_win: float, avg_loss: float) -> float
    """
    计算期望值
    E = win_rate × avg_win - (1-win_rate) × avg_loss
    """

def kelly_criterion(win_rate: float, payoff_ratio: float, fraction: float = 0.5) -> float
    """
    凯利公式(默认半凯利)
    f = (win_rate × payoff_ratio - 1) / (payoff_ratio - 1) × fraction
    """

def calculate_position_size(capital: float, entry: float, stop_loss: float, 
                             max_risk_pct: float = 0.01) -> float
    """
    1%风险原则计算仓位
    position = (capital × max_risk_pct) / (entry - stop_loss)
    """

def backtest_pattern(pattern_name: str, market: str = 'US', 
                      lookback_weeks: int = 520) -> Dict
    """
    回测特定形态的历史胜率
    输入: 形态名称,市场,回看周数
    输出: {
        "total_occurrences": int,
        "win_rate": float,
        "avg_win": float,
        "avg_loss": float,
        "expected_value": float,
        "max_consecutive_losses": int,
        "payoff_ratio": float
    }
    """

def update_strategy_parameters(trades: List[Dict]) -> Dict
    """
    根据最近50笔交易自动调整策略参数
    逻辑:
    - 胜率<40% → 收紧入场条件
    - 盈亏比<1.5 → 调整止损/止盈
    - 某形态连续失败3次 → 降权
    """

def probability_assessment(symbol: str, pattern: Dict, indicators: Dict) -> Dict
    """
    概率评估(主入口)
    输出: {
        "pattern_name": str,
        "historical_win_rate": float,
        "expected_value": float,
        "kelly_position": float,      # 凯利建议仓位
        "risk_adjusted_position": float, # 1%原则仓位
        "recommended_position": float,   # 最终建议仓位
        "signal_strength": str           # STRONG/MODERATE/WEAK
    }
    """
```

### 2.2 数据流

```
历史形态数据 (TimescaleDB)
    → 回测统计胜率/盈亏比
    → 期望值计算
    → 凯利公式 → 仓位建议
    → 1%风险原则 → 最终仓位
```

---

## F3: patient_trading_system.py — 耐心交易系统

### 3.1 函数清单

```python
def screen_leaders(market: str = 'US') -> List[Dict]
    """
    量化筛选清单(A+B+C条件)
    A: 股价>50周MA 且 MA斜率>0
    B: RS前10%
    C: 营收增长>20%(如有数据)
    输出: 符合条件的候选股列表
    """

def update_watchlist(candidates: List[Dict]) -> List[Dict]
    """
    更新观察名单
    逻辑: 新候选加入,已触发/过期的移除
    输出: 更新后的观察名单
    """

def check_trigger_conditions(symbol: str) -> Dict
    """
    检查触发条件(至少3/5满足)
    1. 周线形态:锤子线/吞没/早晨之星
    2. 周线指标:MACD金叉 + RSI<50
    3. 周线波浪:2浪末期或3浪初期
    4. 周线成交量:放量突破
    5. 周线支撑/阻力:突破关键阻力
    输出: {
        "conditions_met": int,
        "conditions_detail": [...],
        "triggered": bool  # conditions_met >= 3
    }
    """

def calculate_entry_plan(symbol: str, capital: float, trigger: Dict) -> Dict
    """
    计算入场计划
    输出: {
        "entry_price": float,
        "stop_loss": float,
        "target_price": float,
        "position_size": float,     # 1%风险原则
        "tranche_1": float,         # 试探仓25%
        "tranche_2": float,         # 加仓仓25%
        "tranche_3": float,         # 锁定仓25%
        "max_loss": float,          # 最大亏损金额
        "risk_reward_ratio": float  # 盈亏比
    }
    """

def manage_position(position: Dict, current_price: float) -> Dict
    """
    持仓管理
    逻辑:
    - 周线趋势未坏 + 未触及止损 → 持有
    - 盈利达到目标 → 考虑加仓
    - 触及止损 → 无条件退出
    - 亏损头寸 → 绝不加仓
    输出: {
        "action": "HOLD"/"ADD"/"EXIT",
        "reason": str,
        "updated_stop_loss": float
    }
    """

def weekly_review() -> Dict
    """
    每周复盘(每周日运行)
    输出: {
        "trades_this_week": int,
        "pnl_this_week": float,
        "current_positions": [...],
        "watchlist_changes": [...],
        "strategy_adjustments": [...]
    }
    """
```

### 3.2 状态机

```
SCREENING → WATCHLIST → TRIGGERED → ENTRY → MANAGING → EXIT
                         ↓                          ↑
                         └── NOT_TRIGGERED ──────────┘
                              (继续等待)
```

---

## F4: clfa_strategy_loop.py — CLFA策略闭环

### 4.1 函数清单

```python
def record_trade(trade: Dict) -> None
    """
    记录交易(6个数据点)
    trade: {symbol, entry_price, stop_loss, target_price, 
            exit_price, weeks_held, result}
    """

def weekly_backtest(lookback: int = 50) -> Dict
    """
    每周自动回测最近N笔
    输出: {
        "win_rate": float,
        "avg_win_loss_ratio": float,
        "expected_value": float,
        "failing_patterns": [...],  # 连续失败3次的形态
        "parameter_adjustments": [...]
    }
    """

def auto_adjust_parameters(backtest_result: Dict) -> Dict
    """
    自动调整策略参数
    逻辑:
    - 胜率<40% → 收紧入场条件
    - 盈亏比<1.5 → 调整止损/止盈
    - 某形态连续失败3次 → 降权/禁用
    """
```

---

## 独立性保证

| 原则 | 实现方式 |
|------|----------|
| 不影响现有系统 | 独立目录 `weekly-trading-system/` |
| 数据共享 | 共用TimescaleDB,只读不写 |
| 渐进集成 | 每个模块独立测试,通过后才集成 |
| 向后兼容 | 现有日K线Pipeline继续运行 |
| 配置独立 | 独立配置文件 `weekly_config.json` |

---

*Last updated: 2026-07-30 14:50 PT*