# 批量策略分析系统 - 技术架构
## 概述
批量策略分析系统旨在同时分析多只股票的期权策略。它从 parquet 文件加载期权快照数据,运行多种策略生成交易信号,并具备市场状态感知能力以实现智能过滤。
## 架构
```
┌─────────────────────────────────────────────────────────────────────────┐
│ 批量策略分析系统 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 数据层 │───▶│ 市场状态增强层 │───▶│ 策略分析层 │ │
│ └─────────────┘ └─────────────────────┘ └─────────────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ LocalDataFetcher TechnicalIndicators 5 种期权策略 │
│ OptionChainSnapshot MarketStateClassifier CoveredCall、PMCC 等 │
│ │
└─────────────────────────────────────────────────────────────────────┘
```
## 核心组件
### 1. 数据层
**LocalDataFetcher** 从 parquet 文件加载期权快照:
```python
from ibkr_mcp.common.option_data import LocalDataFetcher
fetcher = LocalDataFetcher(data_dir)
snapshots = await fetcher.fetch_all(symbols) # 自动选择最新文件
```
**OptionChainSnapshot** 包含:
- 标的符号和标的价格
- 时间戳
- 期权链数据(平均每只股票 352 个期权)
- 可选的市场状态上下文
### 2. 市场状态增强层
连接 IBKR 获取历史数据并计算技术指标:
```python
from ibkr_mcp.common.stock_data import StockDataFetcher
from ibkr_mcp.common.technical_indicators import TechnicalIndicatorProcessor
from ibkr_mcp.common.market_state import MarketStateClassifier
processor = TechnicalIndicatorProcessor()
processor.ensure_default_moving_averages()
enriched = processor.process(history) # 添加 MA5、MA10、MA30
classifier = MarketStateClassifier()
state_result = classifier.classify(enriched, symbol=stock_symbol)
```
**市场状态:**
- `BULL` - 强势上涨趋势
- `UPTREND` - 上涨趋势
- `BEAR` - 下跌趋势
### 3. 策略层
支持五种期权策略:
| 策略 | 类型 | 要求的市场状态 |
|------|------|----------------|
| PutCreditSpreadStrategy | 牛市策略 | BULL 或 UPTREND |
| VerticalSpreadStrategy | 方向性策略 | 无限制 |
| IronCondorStrategy | 中性策略 | 无限制 |
| CoveredCallStrategy | 收入策略 | 无限制 |
| PoorMansCoveredCallStrategy | 收入策略 | 无限制 |
## 关键设计模式
### 多股票市场状态提供者
支持多股票的自定义提供者:
```python
class MultiStockMarketStateProvider:
def __init__(self, state_cache):
self._cache = state_cache
def get_state(self, symbol):
result = self._cache.get(symbol.upper())
return result.state if result else None
# 在策略初始化中使用
market_state_provider = MultiStockMarketStateProvider(state_cache)
strategy = PutCreditSpreadStrategy(
market_state_provider=market_state_provider,
)
```
### 增强上下文构建
```python
def build_enrichment_context(enriched_data, state_result):
context = {}
latest = enriched_data.iloc[-1]
if pd.notna(latest.get("close")):
context["close"] = float(latest["close"])
for col in ("ma5", "ma10", "ma30"):
value = latest.get(col)
if pd.notna(value):
context[col] = float(value)
if state_result:
context["market_state"] = state_result.state.value
return context
```
### 批量分析循环
核心分析模式:
```python
all_signals = []
all_strategy_results = {}
for stock_symbol, snapshot in snapshot_map.items():
for strategy in strategies:
signals = strategy.on_data([snapshot])
all_strategy_results[stock_symbol] = {strategy.name: signals}
```
## 测试结果
**测试配置:**
- 分析股票数:13 只(AAPL、COIN、CRCL、CRWV、GOOGL、HIMS、MARA、MSTR、NFLX、NVDA、OKLO、PLTR、TSLA)
- 测试策略数:5 种
- 总计算次数:65 次(13 × 5)
**结果:**
- 生成信号总数:133 个
- 成功率:84.6%(11/13 只股票生成信号)
- 仅 TSLA 呈现 BULL 市场状态,其余均为 BEAR
**策略表现:**
| 策略 | 信号数 | 覆盖率 |
|------|--------|--------|
| CoveredCallStrategy | 132 | 76.9% |
| VerticalSpreadStrategy | 1 | 7.7% |
| PutCreditSpreadStrategy | 0 | 0.0% |
| IronCondorStrategy | 0 | 0.0% |
| PoorMansCoveredCallStrategy | 0 | 0.0% |
**表现最佳的股票:**
1. MSTR:17 个信号
2. CRWV:16 个信号
3. GOOGL:15 个信号
4. PLTR:15 个信号
5. COIN:14 个信号
## 关键洞察
1. **市场状态影响**:PutCreditSpreadStrategy 要求 BULL 或 UPTREND 市场状态。由于 12/13 只股票处于 BEAR 状态,该策略生成信号为零。仅 TSLA(BULL)符合条件。
2. **策略有效性**:CoveredCallStrategy 最活跃,生成 99.2% 的所有信号。在熊市中,收入型策略优于方向型策略,这是预期结果。
3. **数据质量**:NFLX 和 NVDA 由于期权数据不足(分别只有 2 个和 184 个期权,而平均值为 290 个),未能生成信号。
4. **可扩展性**:批量分析模式能够高效处理多股票和多策略,清晰分离数据加载、增强和分析层。
## 文件结构
```
ibkr-mcp/
├── src/ibkr_mcp/
│ ├── common/
│ │ ├── option_data.py # LocalDataFetcher、OptionChainSnapshot
│ │ ├── stock_data.py # StockDataFetcher
│ │ ├── technical_indicators.py # TechnicalIndicatorProcessor
│ │ └── market_state.py # MarketStateClassifier、MarketState
│ └── strategies/
│ ├── strategy_put_credit_spread.py
│ ├── strategy_vertical_spread.py
│ ├── strategy_iron_condor.py
│ ├── strategy_covered_call.py
│ └── strategy_pmcc.py
├── notebook/
│ └── test_strategy_analysis_file_based.ipynb
└── optiondata/ # 存储期权快照的 Parquet 文件
```
## 未来优化方向
1. **并行处理**:并行执行策略分析以提升性能
2. **信号评分**:按质量指标对信号进行排序
3. **投资组合优化**:从生成的信号构建最优投资组合
4. **回测集成**:根据历史表现验证信号