AI量化投资入门指南:从零搭建你的第一个策略模型

1次阅读
没有评论

共计 2693 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

数据层构建

行情数据获取

使用 yfinance 获取美股数据(或 akshare 获取 A 股数据)是最快捷的方式。以下是日级数据获取示例:

AI 量化投资入门指南:从零搭建你的第一个策略模型

import yfinance as yf
import pandas as pd

# 获取苹果公司三年历史数据
data = yf.download('AAPL', 
                   start='2020-01-01',
                   end='2023-01-01',
                   interval='1d',
                   auto_adjust=True)  # 自动复权

关键注意事项:

  • 复权处理:建议优先使用 auto_adjust=True 参数
  • 停牌处理:用 fillna(method='ffill') 向前填充
  • 分钟数据:需注意 API 调用频率限制

数据清洗流程

  1. 处理缺失值:对停牌日期的 OHLC 数据采用前值填充
  2. 异常值检测:使用 3σ 原则过滤异常价格波动
  3. 数据标准化:将不同量纲的特征缩放到相同区间
# 数据清洗示例
def clean_data(df):
    # 处理缺失值
    df = df.fillna(method='ffill')

    # 去除极端值
    mean = df['Close'].mean()
    std = df['Close'].std()
    df = df[(df['Close'] > mean - 3*std) & 
            (df['Close'] < mean + 3*std)]

    return df

特征工程

技术指标计算

使用 TA-Lib 计算常见技术指标:

import talib

# 计算 MACD
data['macd'], data['signal'], _ = talib.MACD(data['Close'],
                                           fastperiod=12,
                                           slowperiod=26,
                                           signalperiod=9)

# 计算布林带
data['upper'], data['middle'], data['lower'] = talib.BBANDS(data['Close'],
                                                          timeperiod=20)

特征标准化

不同量纲的特征需要统一标准化:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
features = ['macd', 'upper', 'lower']
data[features] = scaler.fit_transform(data[features])

模型构建

监督学习模型

适合趋势跟踪类策略:

from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split

# 构造标签:次日涨跌
data['target'] = (data['Close'].shift(-1) > data['Close']).astype(int)

# 划分数据集
X = data[features]
y = data['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

# 训练模型
model = XGBClassifier(n_estimators=100)
model.fit(X_train, y_train)

强化学习模型

适合高频交易场景:

import gym
from stable_baselines3 import PPO

# 创建交易环境
env = gym.make('stocks-v0', df=data)

# 训练 PPO 智能体
model = PPO('MlpPolicy', env, verbose=1)
model.learn(total_timesteps=10000)

回测实现

Backtrader 框架

import backtrader as bt

class MyStrategy(bt.Strategy):
    def __init__(self):
        self.sma = bt.indicators.SMA(period=15)

    def next(self):
        if self.data.close[0] > self.sma[0]:
            self.buy()
        elif self.data.close[0] < self.sma[0]:
            self.sell()

# 运行回测
cerebro = bt.Cerebro()
datafeed = bt.feeds.PandasData(dataname=data)
cerebro.adddata(datafeed)
cerebro.addstrategy(MyStrategy)
results = cerebro.run()

避免前视偏差

关键措施:

  • 严格按时间戳顺序处理数据
  • 在特征计算中使用 .shift(1) 避免数据泄露
  • 回测时禁用 peek 模式

生产部署

Docker 容器化

FROM python:3.8

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .
CMD ["python", "main.py"]

风控系统设计

class RiskManager:
    def __init__(self, max_drawdown=0.2):
        self.max_drawdown = max_drawdown

    def check_risk(self, portfolio):
        current_dd = 1 - portfolio.value / portfolio.max_value
        return current_dd < self.max_drawdown

风险控制

过拟合检测

采用 Walk-Forward 验证:

  1. 将数据划分为多个训练 / 测试窗口
  2. 滚动训练并记录各窗口表现
  3. 观察测试集表现的稳定性

交易成本模拟

class Slippage(bt.Slippage):
    def __init__(self, slip=0.001):
        self.slip = slip

    def _getslippage(self, size, price):
        return price * (1 + np.sign(size) * self.slip)

延伸思考

策略失效应对

  • 持续监控策略表现(设置预警阈值)
  • 保留多个备选策略
  • 建立市场状态分类器

高频交易优化

# Latency 测量示例
import time

def measure_latency():
    start = time.perf_counter_ns()
    # 执行交易指令
    end = time.perf_counter_ns()
    return (end - start) / 1e6  # 毫秒

经验总结

  1. 数据质量决定策略上限
  2. 简单策略往往更鲁棒
  3. 风险控制比收益更重要
  4. 回测结果需打折扣看待

建议从日频策略开始实践,逐步过渡到更高频次。记住:市场上没有圣杯策略,持续迭代才是王道。

正文完
 0
评论(没有评论)