169 lines
5.7 KiB
Plaintext
169 lines
5.7 KiB
Plaintext
# 增强版情绪伤害策略 - 算法详细说明
|
||
|
||
## 策略概述
|
||
增强版情绪伤害策略是一种基于市场情绪指标(恐惧与贪婪指数)结合技术分析的量化交易策略。该策略通过在市场恐慌时转换为现金,在市场恢复时投资高波动性股票来获取收益。
|
||
|
||
## 核心算法组件
|
||
|
||
### 1. 基于恐惧与贪婪指数的市场择时
|
||
- **数据源**: CNN恐惧与贪婪指数(0-100刻度)
|
||
- **恐惧阈值**: 25(市场恐慌触发点)
|
||
- **贪婪阈值**: 75(获利了结触发点)
|
||
- **逻辑**:
|
||
- 当F&G < 25时:转为现金(避免进一步损失)
|
||
- 当F&G恢复 > 25时:选择高波动股票(恢复阶段投资)
|
||
- 当F&G > 75时:转为QQQ(安全港)
|
||
|
||
### 2. 渐进式调仓系统(4步调仓)
|
||
**关键修复**: 原算法存在复利错误,产生了不可能的收益率。
|
||
|
||
#### 修复后的实现:
|
||
```python
|
||
def start_transition(self, date, target_type, stocks=None):
|
||
# 在开始时计算总资金,存储固定分配计划防止复利错误
|
||
|
||
def gradual_transition(self, date, target_type, stocks=None):
|
||
# 每步执行预定分配的1/4,不重新计算总价值
|
||
```
|
||
|
||
**调仓类型**:
|
||
- **转现金**: 在4个交易日内卖出所有非QQQ持仓
|
||
- **转波动股**: 用可用现金买入选定的高波动股票
|
||
- **转QQQ**: 在4天内卖出所有持仓并买入QQQ
|
||
|
||
**为什么4步**: 减少大额仓位变化的市场冲击和滑点
|
||
|
||
### 3. 技术指标过滤系统
|
||
高波动股票选择需要满足3个指标中至少2个显示上涨趋势:
|
||
|
||
#### MACD黄金交叉
|
||
```python
|
||
macd > macd_signal # 当前MACD高于信号线
|
||
```
|
||
|
||
#### RSI向上趋势
|
||
```python
|
||
current_rsi > 30 # RSI大于30(避免超卖)
|
||
```
|
||
|
||
#### 移动平均线交叉(5/20周期)
|
||
```python
|
||
sma_5 > sma_20 # 短期动量超过长期
|
||
```
|
||
|
||
### 4. 止损保护(15%规则)
|
||
- **触发条件**: 任何波动股持仓跌破平均买入价15%
|
||
- **执行动作**: 立即卖出该持仓并买入等值QQQ
|
||
- **目的**: 风险管理,防止大额损失
|
||
|
||
## 状态机实现
|
||
|
||
```
|
||
QQQ_HOLD → [F&G < 25] → FEAR_TRANSITION → CASH_WAIT
|
||
↓ (4步)
|
||
CASH_WAIT → [F&G ≥ 25] → GREED_TRANSITION → VOLATILE_STOCKS
|
||
↓ (4步) ↓ [F&G > 75]
|
||
QQQ_TRANSITION
|
||
↓ (4步)
|
||
QQQ_HOLD
|
||
```
|
||
|
||
## 关键算法修复
|
||
|
||
### 原始BUG: 初始化错误
|
||
```python
|
||
# 错误(导致资金翻倍):
|
||
self.cash = initial_capital # 设置现金
|
||
self.positions['QQQ'] = qqq_shares # 买入QQQ但没有清零现金
|
||
```
|
||
|
||
### 修复后的算法:
|
||
```python
|
||
# 正确(资金正常):
|
||
self.positions['QQQ'] = qqq_shares
|
||
self.cash = 0 # 修复: 买入QQQ后清零现金
|
||
```
|
||
|
||
### 股票选择逻辑修复
|
||
```python
|
||
# 原来: 只使用波动率过滤(过于简单)
|
||
if vol > 0.2: # 20%波动率阈值过高
|
||
volatilities[ticker] = vol
|
||
|
||
# 修复后: 技术指标过滤 + 波动率排序
|
||
if self.check_technical_indicators(ticker, date): # RSI+MACD+SMA过滤
|
||
if vol > 0.1: # 降低波动率阈值
|
||
qualified_stocks.append((ticker, vol))
|
||
```
|
||
|
||
### 交易逻辑修复
|
||
```python
|
||
# 原来: 等权重买入所有股票
|
||
amount_per_stock = cash / len(stocks) # 分散投资
|
||
for ticker in stocks:
|
||
buy(ticker, amount_per_stock)
|
||
|
||
# 修复后: 每次买入波动性最强的1支股票
|
||
current_step_index = min(self.current_step, len(stocks) - 1)
|
||
ticker = stocks[current_step_index] # 按波动性排序,每次买最强的
|
||
buy(ticker, cash_this_step) # 最多同时持有4支股票
|
||
```
|
||
|
||
## 性能特征
|
||
|
||
### 风险管理功能:
|
||
- **最大回撤控制**: 市场恐慌时转为现金
|
||
- **仓位管理**: 最多同时持有4支高波动股票
|
||
- **止损保护**: 每个持仓最大损失15%
|
||
- **渐进执行**: 4步调仓减少市场冲击
|
||
|
||
### 预期行为:
|
||
- **牛市**: 通过QQQ适度参与
|
||
- **熊市**: 恐慌阶段现金保值
|
||
- **恢复阶段**: 高波动股票攻击性持仓
|
||
- **过热市场**: 防御性回到QQQ
|
||
|
||
## 技术实现细节
|
||
|
||
### 数据库依赖:
|
||
- `fear_greed_index`: CNN恐惧与贪婪历史数据
|
||
- `{ticker}`: 个股OHLCV + 技术指标数据
|
||
- `qqq`: QQQ ETF历史价格(真实数据)
|
||
- `fear_greed_data.spy_close`: SPY基准数据
|
||
|
||
### 计算的性能指标:
|
||
- 总回报、年化回报、夏普比率
|
||
- 最大回撤和恢复期
|
||
- 胜率和交易频率
|
||
- 与市场基准的相关性
|
||
|
||
## 已知限制与未来改进
|
||
|
||
### 当前问题:
|
||
1. **技术指标过滤过严**: 导致大部分恐慌期找不到合适股票
|
||
2. **交易记录不完整**: gradual_transition中的交易未被记录
|
||
3. **市场制度变化**: 可能无法适应结构性市场变化
|
||
|
||
### 计划增强:
|
||
1. **放宽技术指标**: 降低过滤标准,提高股票选择成功率
|
||
2. **完善交易记录**: 确保所有交易都被正确记录
|
||
3. **动态阈值**: 根据市场波动调整F&G阈值
|
||
4. **风险缩放**: 基于波动率估算调整仓位大小
|
||
|
||
## 回测结果(修复后)
|
||
- **期间**: 2007-2025(18年)
|
||
- **总回报**: 1258.3%(修复初始化BUG后)
|
||
- **年化回报**: 15.7%(略低于QQQ的16.3%)
|
||
- **最大回撤**: 待优化
|
||
- **交易次数**: 0(技术指标过滤太严格)
|
||
|
||
## 文件结构:
|
||
```
|
||
strategy/emotional-damage/
|
||
├── backtest_emotional_damage_enhanced_v2.py # 主策略(已修复)
|
||
├── generate_enhanced_pdf_report.py # 报告生成器
|
||
├── enhanced_emotional_damage_strategy_report_*.pdf # 结果报告
|
||
└── enhanced-emotional-damage.txt # 本文档
|
||
```
|
||
|
||
**状态**: 策略逻辑已修复,但技术指标过滤需要优化以提高选股成功率。目前表现接近QQQ买入持有策略,但缺少波动股票投资机会。 |