博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MACD日回测代码以及MACD的计算方法
阅读量:2051 次
发布时间:2019-04-28

本文共 2010 字,大约阅读时间需要 6 分钟。

开始学习期货的量化交易,从米筐API上拷贝的一个关于股指期货主力合约日级别MACD日回测的入门代码:

首先,先看一下关于MACD的介绍以及计算方式:MACD称为指数平滑移动平均线,是从双指数移动平均线发展而来,由快的指数移动平均线(EMA12)减去慢的指数移动平均线(EMA26)得到快线DIF,再用2×(快线DIF-DIF的9日加权移动均线DEA)得到MACD柱。
关于以上的几种指标:
EMA12:指数移动平均线。EMA(12)=(收盘价-昨日的EMA)×2/13+昨日的EMA
=收盘价*2/13+昨日的EMA×11/13(股票上市的第一天的EMA是0)
这样意思很明显了,这个EMA(12)的计算值表示的是今天的收盘价的权重分配为2/13,前一天计算的EMA分配为11/13。
EMA26:指数移动平均线。同理EMA(12),EMA(26)=收盘价*25/27+昨日的EMA×2/27。
DIF:离差值。即12日EMA数值减去26日EMA数值。即为talib-MACD返回值macd。
DEA:离差平均值。今日DEA = (前一日DEA X 8/10 + 今日DIF X 2/10),即为talib-MACD返回值signal。
DIF与它自己的移动平均之间差距的大小一般BAR=(DIF-DEA)×2,即为MACD柱状图。但是talib中MACD的计算是bar = (DIF-DEA)×1。

# 可以自己import我们平台支持的第三方python模块,比如pandas、numpy等import talib# 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递def init(context):    # context内引入全局变量s1,存储目标合约信息    context.s1 = 'IF1606'    # 使用MACD需要设置长短均线和macd平均线的参数    context.SHORTPERIOD = 12    context.LONGPERIOD = 26    context.SMOOTHPERIOD = 9    context.OBSERVATION = 50    #初始化时订阅合约行情。订阅之后的合约行情会在handle_bar中进行更新    subscribe(context.s1)# 你选择的期货数据更新将会触发此段逻辑,例如日线或分钟线更新def handle_bar(context, bar_dict):    # 开始编写你的主要的算法逻辑    # 获取历史收盘价序列,history_bars函数直接返回ndarray,方便之后的有关指标计算    prices = history_bars(context.s1, context.OBSERVATION, '1d', 'close')    # 用Talib计算MACD取值,得到三个时间序列数组,分别为macd,signal 和 hist    macd, signal, hist = talib.MACD(prices, context.SHORTPERIOD,                                    context.LONGPERIOD, context.SMOOTHPERIOD)    # macd 是长短均线的差值(即DIF),signal是macd的均线(即DEA),如果短均线从下往上突破长均线,为入场信号,进行买入开仓操作    if macd[-1] - signal[-1] > 0 and macd[-2] - signal[-2] < 0:        sell_qty = context.portfolio.positions[context.s1].sell_quantity        # 先判断当前卖方仓位,如果有,则进行平仓操作        if sell_qty > 0:            buy_close(context.s1, 1)        # 买入开仓        buy_open(context.s1, 1)    if macd[-1] - signal[-1] < 0 and macd[-2] - signal[-2] > 0:        buy_qty = context.portfolio.positions[context.s1].buy_quantity        # 先判断当前买方仓位,如果有,则进行平仓操作        if buy_qty > 0:            sell_close(context.s1, 1)        # 卖出开仓        sell_open(context.s1, 1)

转载地址:http://zuklf.baihongyu.com/

你可能感兴趣的文章
在win7系统中使用nodejs在WebStrom下配置socket.io
查看>>
caffe:用自己的图像数据训练模型
查看>>
ubuntu下clion中配置opencv的CMakeLists.txt
查看>>
什么是卷积 卷积有什么用
查看>>
有趣的机器学习概念纵览:从多元拟合,神经网络到深度学习,给每个感兴趣的人
查看>>
K-近邻算法:KNN
查看>>
solver及其配置
查看>>
图说C++对象模型:对象内存布局详解
查看>>
【Java基础】Java类的加载和对象创建流程的详细分析
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java多线程知识点总结
查看>>
Java集合框架知识梳理
查看>>
java中IO流知识梳理
查看>>
word2010如何保持在公式后面键入空格后或添加文字不变小?
查看>>
笔试题(一)—— java基础
查看>>
笔试题(二)—— sql语句
查看>>
Redis学习笔记(二)— 在linux下搭建redis服务器
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Eclipse配置错误——An internal error occurred during: "Building workspace".GC overhead limit exceeded
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>