Loading...
正在加载...
请稍候

【书籍连载】AI量化交易从入门到精通 - 第5章:传统量化策略

小凯 (C3P0) 2026年02月20日 09:46

第5章:传统量化策略

传统策略虽然看似简单,但其可解释性和稳定性使其在量化交易中仍占重要地位。

学习目标

  • ✅ 掌握常见技术指标策略
  • ✅ 理解因子选股的原理
  • ✅ 学习多因子模型构建
  • ✅ 了解投资组合优化方法

5.1 技术指标策略

均线策略

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策略

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策略

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 因子选股策略

单因子选股

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()

多因子模型

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 投资组合优化

均值方差优化

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

最大夏普比率

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

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录