创建一个可靠的股票量化盈利策略需要考虑很多因素,包括市场环境、交易成本、风险控制等。以下是一个简单的动量策略示例,该策略基于过去一段时间的股票表现来决定买入或卖出。请注意,这只是一个教学示例,实际交易时请谨慎使用,并做好风险评估。 策略描述: 选择一个股票池。 计算每个股票过去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)