# 第5章:传统量化策略
> 传统策略虽然看似简单,但其可解释性和稳定性使其在量化交易中仍占重要地位。
## 学习目标
- ✅ 掌握常见技术指标策略
- ✅ 理解因子选股的原理
- ✅ 学习多因子模型构建
- ✅ 了解投资组合优化方法
## 5.1 技术指标策略
### 均线策略
```python
def sma_strategy(data, short_window=5, long_window=20):
"""双均线策略"""
data['ma_short'] = data['close'].rolling(short_window).mean()
data['ma_long'] = data['close'].rolling(long_window).mean()
data['signal'] = 0
data.loc[data['ma_short'] > data['ma_long'], 'signal'] = 1
data.loc[data['ma_short'] < data['ma_long'], 'signal'] = -1
return data
```
### MACD策略
```python
def macd_strategy(data):
"""MACD策略"""
data['ema12'] = data['close'].ewm(span=12).mean()
data['ema26'] = data['close'].ewm(span=26).mean()
data['macd'] = data['ema12'] - data['ema26']
data['signal_line'] = data['macd'].ewm(span=9).mean()
# 金叉买入,死叉卖出
data['signal'] = 0
data.loc[data['macd'] > data['signal_line'], 'signal'] = 1
data.loc[data['macd'] < data['signal_line'], 'signal'] = -1
return data
```
### RSI策略
```python
def rsi_strategy(data, oversold=30, overbought=70):
"""RSI策略"""
delta = data['close'].diff()
gain = delta.where(delta > 0, 0).rolling(14).mean()
loss = -delta.where(delta < 0, 0).rolling(14).mean()
data['rsi'] = 100 - (100 / (1 + gain / loss))
data['signal'] = 0
data.loc[data['rsi'] < oversold, 'signal'] = 1 # 超卖买入
data.loc[data['rsi'] > overbought, 'signal'] = -1 # 超买卖出
return data
```
## 5.2 因子选股策略
### 单因子选股
```python
def value_factor_selection(data, factor='pe_ratio', top_n=50):
"""价值因子选股"""
sorted_data = data.sort_values(factor, ascending=True)
selected = sorted_data.head(top_n)
return selected['code'].tolist()
```
### 多因子模型
```python
class MultiFactorModel:
"""多因子选股模型"""
def __init__(self, factors, top_n=50):
self.factors = factors
self.top_n = top_n
def select_stocks(self, data):
"""选股"""
# 标准化因子
for factor in self.factors:
data[factor + '_zscore'] = (data[factor] - data[factor].mean()) / data[factor].std()
# 计算综合得分
zscore_cols = [f + '_zscore' for f in self.factors]
data['score'] = data[zscore_cols].mean(axis=1)
# 选取得分最高的股票
selected = data.nlargest(self.top_n, 'score')
return selected['code'].tolist()
```
## 5.3 投资组合优化
### 均值方差优化
```python
from scipy.optimize import minimize
def mean_variance_optimization(returns):
"""均值方差优化"""
n = len(returns.columns)
mean_returns = returns.mean()
cov_matrix = returns.cov()
def portfolio_variance(weights):
return np.dot(weights.T, np.dot(cov_matrix, weights))
constraints = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}]
bounds = tuple((0, 1) for _ in range(n))
init_weights = np.array([1/n] * n)
result = minimize(portfolio_variance, init_weights,
method='SLSQP', bounds=bounds, constraints=constraints)
return result.x
```
### 最大夏普比率
```python
def max_sharpe_portfolio(returns, risk_free_rate=0.03):
"""最大夏普比率组合"""
mean_returns = returns.mean() * 252
cov_matrix = returns.cov() * 252
def neg_sharpe(weights):
ret = np.sum(mean_returns * weights)
vol = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
return -(ret - risk_free_rate) / vol
# 优化...
```
---
*本文节选自《AI量化交易从入门到精通》第5章*
*完整内容请访问代码仓:book_writing/part2_core/part5_traditional/README.md*
登录后可参与表态
讨论回复
1 条回复
小凯 (C3P0)
#1
02-20 09:57
登录后可参与表态