聚宽量化平台教程:构建基于“MACD金叉”的自动交易策略

聚宽量化平台教程:构建基于“MACD金叉”的自动交易策略缩略图

聚宽量化平台教程:构建基于“MACD金叉”的自动交易策略

一、引言

随着金融市场的不断发展,量化投资逐渐成为投资者进行资产配置的重要方式。聚宽(JoinQuant)作为国内领先的量化交易平台,为投资者提供了一个集策略编写、回测、模拟交易和实盘交易于一体的平台。本文将以“MACD金叉”为核心信号,手把手教你在聚宽平台上构建一个自动交易策略。

MACD(Moving Average Convergence Divergence)即指数平滑异同移动平均线,是一种广泛应用于技术分析的指标。其中,“MACD金叉”指的是MACD快线(DIF)上穿信号线(DEA),通常被视为股价上涨的信号,适合用于构建多头交易策略。

二、策略逻辑概述

本策略的核心逻辑如下:

买入条件:当某只股票的MACD快线(DIF)上穿信号线(DEA)时,形成“MACD金叉”,判断为买入信号。 卖出条件:当MACD快线下穿信号线,形成“死叉”时,视为卖出信号。 仓位管理:可设置固定仓位,或根据账户资金动态调整。 交易频率:适用于日线级别交易,适合中短线投资者。

三、准备工作

3.1 注册聚宽账户

访问 聚宽官网 注册账号,并完成实名认证。

3.2 安装开发环境

聚宽支持在网页端直接编写策略代码,无需本地安装。但若希望在本地进行调试,可安装JQData等本地数据接口。

3.3 熟悉API文档

聚宽提供丰富的API用于获取数据、下单交易、获取账户信息等。建议熟悉以下常用函数:

attribute_history():获取历史数据 order() / order_value():下单交易 get_current_data():获取当前行情 log():输出日志信息

四、策略实现步骤

4.1 策略初始化

在策略的初始化函数中,我们设置回测的基本参数,如初始资金、基准指数、交易费用等,并定义用于记录MACD状态的变量。

def initialize(context): # 设置初始资金 set_benchmark(‘000300.XSHG’) # 设置沪深300为基准 set_option(‘use_real_price’, True) set_slippage(PriceSlippage(0.002)) # 设置滑点 set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type=’stock’) # 初始化全局变量 context.stock = ‘000001.XSHE’ # 示例股票:平安银行 context.position = 0 # 当前持仓状态

4.2 获取MACD指标

使用attribute_history()函数获取指定周期的历史行情数据,调用talib.MACD计算MACD指标。

import talib def get_macd_data(context, stock, period=30): hist = attribute_history(stock, period, ‘1d’, [‘close’]) close_prices = hist[‘close’].values macd, signal, histgram = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9) return macd[-2:], signal[-2:], histgram[-2:]

4.3 判断金叉与死叉

通过比较MACD快线与信号线的前后值,判断是否发生金叉或死叉。

def is_golden_cross(macd, signal): return (macd[-2] < signal[-2]) and (macd[-1] > signal[-1]) def is_dead_cross(macd, signal): return (macd[-2] > signal[-2]) and (macd[-1] < signal[-1])

4.4 主逻辑函数

主逻辑函数每天运行一次,检查是否满足买入或卖出条件,并执行交易。

def handle_data(context, data): stock = context.stock current_data = get_current_data() if current_data[stock].paused: return # 跳过停牌股票 # 获取MACD数据 macd, signal, _ = get_macd_data(context, stock) # 判断金叉 if is_golden_cross(macd, signal) and context.position == 0: log.info(f’发现MACD金叉,买入{stock}’) order_value(stock, context.portfolio.total_value * 0.9) # 90%仓位买入 context.position = 1 # 更新持仓状态 # 判断死叉 elif is_dead_cross(macd, signal) and context.position == 1: log.info(f’发现MACD死叉,卖出{stock}’) order_target_value(stock, 0) # 清仓 context.position = 0 # 更新持仓状态

五、策略回测与优化

5.1 回测参数设置

在聚宽平台中设置回测时间范围、初始资金、交易频率等参数:

回测起止时间:2020-01-01 至 2024-01-01 初始资金:100万 交易频率:日线 基准指数:沪深300

5.2 回测结果分析

回测完成后,查看收益曲线、夏普比率、最大回撤等指标,评估策略表现。若表现不佳,可以从以下几个方面进行优化:

参数优化:调整MACD参数(12, 26, 9)为其他组合,如(10, 20, 5); 过滤条件:加入成交量放大、均线排列等过滤条件,提高信号准确性; 多股票交易:将策略扩展为多股票轮动策略,提高资金利用率; 止损止盈机制:加入固定止损或移动止盈机制,控制风险。

5.3 示例优化:加入成交量过滤

def get_volume_data(context, stock, period=5): hist = attribute_history(stock, period, ‘1d’, [‘volume’]) volumes = hist[‘volume’].values avg_volume = np.mean(volumes[:-1]) today_volume = volumes[-1] return today_volume > avg_volume * 1.5 # 今日成交量大于5日平均1.5倍

在买入条件中加入成交量判断:

if is_golden_cross(macd, signal) and context.position == 0 and get_volume_data(context, stock): …

六、策略部署与实盘交易

完成回测验证后,可通过聚宽平台进行模拟交易或实盘交易:

模拟交易:在“我的策略”页面启用模拟交易,观察策略在真实市场中的表现; 实盘交易:绑定券商账户后,可将策略部署为实盘运行。

七、总结

本文详细介绍了如何在聚宽量化平台上构建一个基于MACD金叉的自动交易策略。从策略逻辑设计、代码实现、回测分析到实盘部署,每一步都进行了讲解。MACD金叉策略简单直观,适合量化入门者学习与实践。当然,任何策略在实际应用中都需结合市场环境不断优化和调整。

通过本文的学习,你不仅可以掌握聚宽平台的使用方法,还能理解如何将技术指标转化为可执行的交易策略。希望你能在量化投资的道路上越走越远,构建出属于自己的稳定盈利策略。

附录:完整策略代码

import talib import numpy as np from jqdata import * def initialize(context): set_benchmark(‘000300.XSHG’) set_option(‘use_real_price’, True) set_slippage(PriceSlippage(0.002)) set_order_cost(OrderCost(open_tax=0, close_tax=0.001, open_commission=0.0003, close_commission=0.0003, close_today_commission=0, min_commission=5), type=’stock’) context.stock = ‘000001.XSHE’ context.position = 0 def get_macd_data(context, stock, period=30): hist = attribute_history(stock, period, ‘1d’, [‘close’]) close_prices = hist[‘close’].values macd, signal, histgram = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9) return macd[-2:], signal[-2:], histgram[-2:] def get_volume_data(context, stock, period=5): hist = attribute_history(stock, period, ‘1d’, [‘volume’]) volumes = hist[‘volume’].values avg_volume = np.mean(volumes[:-1]) today_volume = volumes[-1] return today_volume > avg_volume * 1.5 def is_golden_cross(macd, signal): return (macd[-2] < signal[-2]) and (macd[-1] > signal[-1]) def is_dead_cross(macd, signal): return (macd[-2] > signal[-2]) and (macd[-1] < signal[-1]) def handle_data(context, data): stock = context.stock current_data = get_current_data() if current_data[stock].paused: return macd, signal, _ = get_macd_data(context, stock) if is_golden_cross(macd, signal) and context.position == 0 and get_volume_data(context, stock): log.info(f’发现MACD金叉,买入{stock}’) order_value(stock, context.portfolio.total_value * 0.9) context.position = 1 elif is_dead_cross(macd, signal) and context.position == 1: log.info(f’发现MACD死叉,卖出{stock}’) order_target_value(stock, 0) context.position = 0

参考资料:

聚宽官方文档 Talib官方文档 《量化投资:策略与技术》- 丁鹏 著

如需进一步交流或获取策略源码,请留言或私信。

滚动至顶部