19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。
接下来会对于Quant Connect平台介绍。
QuantConnect是国际领先的量化交易平台,提供云端量化策略开发、回测与部署服务,支持多资产类别(股票、期货、加密货币等)以及多种编程语言(如C#、Python)。凭借其强大的算法库和与主要券商的集成,QuantConnect成为全球量化交易爱好者和专业投资者的理想平台。
本文以经典的"双均线策略"为例,展示在QuantConnect平台上完成策略开发和回测的完整流程。
1. 策略背景:双均线策略
双均线策略是一种简单且广泛应用的趋势跟随型策略,其核心在于短期均线与长期均线的交叉关系:
- 买入信号:短期均线上穿长期均线(黄金交叉)。
- 卖出信号:短期均线下穿长期均线(死亡交叉)。
该策略适用于趋势行情,通常在震荡市中表现欠佳。
2. 策略开发
在QuantConnect中,策略开发主要通过Python或C#编写。在这里,我们选用Python实现"双均线策略"。
(1)初始化策略
在策略初始化阶段,设定交易标的、时间框架和均线参数。
from AlgorithmImports import *
class DualMovingAverageAlgorithm(QCAlgorithm):
def Initialize(self):
# 设置回测起止时间
self.SetStartDate(2020, 1, 1)
self.SetEndDate(2022, 1, 1)
# 设置初始资金
self.SetCash(100000)
# 添加交易标的
self.symbol = self.AddEquity("AAPL", Resolution.Daily).Symbol
# 定义短期和长期均线窗口
self.short_window = 10
self.long_window = 50
# 创建均线指标
self.short_ma = self.SMA(self.symbol, self.short_window, Resolution.Daily)
self.long_ma = self.SMA(self.symbol, self.long_window, Resolution.Daily)
# 确保均线有足够数据
self.SetWarmUp(self.long_window)
self.previous_crossover = None
self.Log("策略初始化完成")
(2)生成交易信号
在OnData
方法中,根据短期和长期均线的交叉信号生成交易指令。
def OnData(self, data):
# 检查均线是否准备就绪
if not self.short_ma.IsReady or not self.long_ma.IsReady:
return
# 获取当前均线值
short_value = self.short_ma.Current.Value
long_value = self.long_ma.Current.Value
# 生成交易信号
if short_value > long_value and (self.previous_crossover != "golden"):
self.SetHoldings(self.symbol, 1) # 全仓买入
self.previous_crossover = "golden"
self.Log(f"黄金交叉 - 买入 {self.symbol.Value} at {self.Securities[self.symbol].Price}")
elif short_value < long_value and (self.previous_crossover != "death"):
self.Liquidate(self.symbol) # 清仓
self.previous_crossover = "death"
self.Log(f"死亡交叉 - 卖出 {self.symbol.Value} at {self.Securities[self.symbol].Price}")
3. 策略回测
QuantConnect平台提供了强大的回测引擎,可以在历史数据上验证策略的有效性。
(1)配置回测参数
在初始化方法中已经设置了回测的时间范围、初始资金及交易标的。
(2)运行策略
在运行回测时,QuantConnect自动加载历史数据并执行策略逻辑。平台支持可视化输出资金曲线、交易信号和回测报告。
4. 策略优化
QuantConnect支持参数优化,通过Parameter
方法定义可调参数,并使用网格搜索或其他优化算法寻找最佳参数组合。
(1)定义可调参数
将短期和长期均线窗口设置为参数化变量。
class DualMovingAverageAlgorithm(QCAlgorithm):
def Initialize(self):
# 参数化窗口
self.short_window = int(self.GetParameter("short_window", 10))
self.long_window = int(self.GetParameter("long_window", 50))
(2)运行参数优化
通过QuantConnect CLI或平台界面启动参数优化任务。例如,优化短期均线在[5, 15]范围内和长期均线在[30, 60]范围内的组合。
(3)优化后的调整
优化结果导出后,可以根据最佳参数组合调整策略配置,提升其在历史数据中的表现。
5. 添加风险管理
在策略中添加止盈止损逻辑可以帮助控制极端行情下的风险。
实现止盈止损
def OnData(self, data):
if self.Portfolio[self.symbol].Invested:
position = self.Portfolio[self.symbol]
# 计算持仓收益率
profit_loss = (position.UnrealizedProfitPercent)
# 设置止盈和止损阈值
take_profit = 0.1 # 止盈10%
stop_loss = -0.05 # 止损5%
if profit_loss >= take_profit:
self.Liquidate(self.symbol)
self.Log(f"止盈触发 - 卖出 {self.symbol.Value} at {self.Securities[self.symbol].Price}")
elif profit_loss <= stop_loss:
self.Liquidate(self.symbol)
self.Log(f"止损触发 - 卖出 {self.symbol.Value} at {self.Securities[self.symbol].Price}")
通过这些改进,可以提高策略在复杂市场中的稳定性。