股票量化策略示例

创建一个可靠的股票量化盈利策略需要考虑很多因素,包括市场环境、交易成本、风险控制等。以下是一个简单的动量策略示例,该策略基于过去一段时间的股票表现来决定买入或卖出。请注意,这只是一个教学示例,实际交易时请谨慎使用,并做好风险评估。 策略描述: 选择一个股票池。 计算每个股票过去20个交易日的收益率。 买入收益率最高的股票,持有5个交易日。 每隔5个交易日重新计算并调整持仓。 以下是对应的Python量化代码,使用的是pandas和numpy库,以及backtrader框架进行回测:


import backtrader as bt
import pandas as pd
import numpy as np

# 创建策略
class MomentumStrategy(bt.Strategy):
    params = (
        ('lookbackdays', 20),  # 回看天数
        ('holddays', 5),       # 持有天数
    )

    def __init__(self):
        self.dataclose = self.datas[0].close
        self.order = None
        self.lookback = self.params.lookbackdays
        self.hold = self.params.holddays

    def next(self):
        if self.order:  # 检查是否有未完成的订单
            return

        if not self.position:  # 如果没有持仓
            # 计算过去lookback天的收益率
            returns = np.log(self.dataclose.get(size=self.lookback) / self.dataclose[0:self.lookback])
            # 找到收益率最高的股票
            momentum_stock = np.argmax(returns)
            # 买入
            self.order = self.buy(data=momentum_stock, size=self.broker.getvalue() * 0.1 / self.dataclose[0])

        if len(self) % self.holddays == 0:  # 每隔holddays天
            self.close()  # 平仓

# 回测函数
def backtest(stockdata):
    cerebro = bt.Cerebro()
    cerebro.addstrategy(MomentumStrategy)
    for data in stockdata:
        cerebro.adddata(data)
    cerebro.broker.setcash(100000)  # 设置初始资金
    cerebro.run()
    cerebro.plot()

# 加载数据
def loaddata(stocklist, startdate, enddate):
    stockdata = []
    for stock in stocklist:
        data = bt.feeds.YahooFinanceData(dataname=stock, fromdate=startdate, todate=enddate)
        stockdata.append(data)
    return stockdata

# 示例股票列表
stocklist = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'FB']
# 加载数据
stockdata = loaddata(stocklist, '2020-01-01', '2021-01-01')
# 执行回测
backtest(stockdata)