talib包是计算许多行情指标必备的第三方库,但在计算过程中发现,计算出来的数值和行情软件的计算方法存在很大的差异,可能会导致策略出现错误。为此,专门写了一个函数解决这个问题。欢迎大家一起交流讨论。

MACD的计算

MACD的计算很简单,主要包括DIF、DEA和BAR三个参数。计算方式如下:


(图片来源百度百科)

注: 在计算过程中,需要注意数据的初始化。上市首日,DIF、DEA、BAR默认为0.但次日计算中EMA12和EMA26是按照上市首日的收盘价来计算的,所以这里面涉及一个初始化的问题。在计算上市以来第二个交易日的MACD时要先将EMA12和EMA26都替换为上市首日收盘价。

函数编写思路

  • 首先,需要自上市以来的收盘价数据。这里利用掘金的history接口,将开始日期设置为一个较早的日期以确保将标的自上市以来的全部收盘价都涵盖(这里设定为1997年)。

  • 其次,根据上图中的公式计算出各项指标,存为dataframe。

  • 最后,由于不需要上市以来全部的MACD指标,只需要其中的一段时间。所以,设定一个时间筛选条件,能够满足只要设定开始时间和结束时间即可提取到所需数据的函数。

基于以上思路,可以编写出函数如下:

def get_macd(symbol,start_time,end_time):# 取历史数据data = history(symbol = symbol,frequency = '1d',start_time = '1997-01-20',end_time = end_time,fields = 'symbol,bob,close',df = True)index = data['bob'].apply(lambda x: x.strftime('%Y-%m-%d')).tolist()# 编写计算函数# 上市首日,DIFF、DEA、MACD = 0# 用来装变量的listEMA12 = []EMA26 = []DIFF = []DEA = []BAR = []# 如果是上市首日if len(data) == 1:# 则DIFF、DEA、MACD均为0DIFF = [0]DEA = [0]BAR = [0]# 如果不是首日else:# 第一日的EMA要用收盘价代替EMA12.append(data['close'].iloc[0])EMA26.append(data['close'].iloc[0])DIFF.append(0)DEA.append(0)BAR.append(0)# 计算接下来的EMA# 搜集收盘价close = list(data['close'].iloc[1:])    # 从第二天开始计算,去掉第一天for i in close:ema12 = EMA12[-1] * (11/13) + i * (2/13)ema26 = EMA26[-1] * (25/27) + i * (2/27)diff = ema12 - ema26dea = DEA[-1] * (8/10) + diff * (2/10)bar = 2 * (diff - dea)# 将计算结果写进list中EMA12.append(ema12)EMA26.append(ema26)DIFF.append(diff)DEA.append(dea)BAR.append(bar)# 返回全部的macdMACD = pd.DataFrame({'DIFF':DIFF,'DEA':DEA,'BAR':BAR, 'time':index},index = index)# 按照时间筛选子集MACD = MACD[(MACD['time'] >= start_time) & (MACD['time'] <= end_time)]return MACD

利用数据验证一下。我用的是大商所的豆油(DCE.y2011合约),结果和东方财富显示的相符。

a = get_macd(symbol = 'DCE.y2011',start_time = '2020-01-01',end_time = '2020-10-22')

Tips:
虽然这样能够解决talib计算MACD和行情软件有差异的问题,但这样计算也会衍生出新的问题。

  1. 将该函数放到循环中,每循环一次就要重新提取一次数据,无形之中增加了策略运行的时间和工作量。
  2. 如果利用其他频率的数据计算macd(比如用60s的数据计算MACD),没有能够追溯到上市当天的历史数据,这样计算出来的结果仍然是不准确的。

自己写函数 or 用talib包?

由于talib包没有详细的计算方法解释,所以暂时无法得知该包是怎样计算macd的,但不可否认的是,在事件驱动的高频交易中,用talib包的确更方便一些。

基于以上,选择哪种方法还需自行斟酌。

---------------------------------------------------------------------------------------------

推荐阅读:

1.一个量化策略师的自白(好文强烈推荐)

2.股票期货经典的量化交易策略都在这里了!(源码)

3.期货/股票数据大全查询(历史/实时/Tick/财务等)

4.史上最全的Python定量金融三方库汇总

5.干货 | 量化选股策略模型大全

6.量化金融经典理论、重要模型、发展简史大全

talib包计算MACD值和行情软件有差异的解决方法相关推荐

  1. C# .net中cookie值为中文时的乱码解决方法

    C# .net中cookie值为中文时的乱码解决方法 一.cookie的名称或子cookie的名称不能为中文,否则无法获得cookie 这个好办,名称不用中文即可 二.cookie的值为中文时候,取c ...

  2. 本地计算机上的 postgresql 服务启动后停止解决方法

    本地计算机上的 postgresql 服务启动后停止解决方法 参考文章: (1)本地计算机上的 postgresql 服务启动后停止解决方法 (2)https://www.cnblogs.com/mr ...

  3. 更换mysql-connector-java-6.0.5jar包后程序出现的两个异常及解决方法

    更换mysql-connector-java-6.0.5jar包后程序出现的两个异常及解决方法 参考文章: (1)更换mysql-connector-java-6.0.5jar包后程序出现的两个异常及 ...

  4. VLOOKUP函数返回错误值#N/A的两种解决方法

    VLOOKUP函数返回错误值#N/A的两种解决方法 参考文章: (1)VLOOKUP函数返回错误值#N/A的两种解决方法 (2)https://www.cnblogs.com/gonghongwei/ ...

  5. 鸿业负荷计算9.0打不开闪退完美解决方法

    鸿业负荷计算9.0打不开闪退完美解决方法 安装鸿业暖通空调12.0破解版后,发现鸿业暖通负荷计算打不开闪退 原因是你的鸿业负荷计算使用的是试用版,改成正式版即可. 修改方法: 在开始中找到鸿业设备设计 ...

  6. Win10提示"由于启动计算机时出现了页面文件配置问题"解决方法

    Windows10系统开机之后,弹出系统属性对话框,提示"由于启动计算机时出现了页面文件配置问题"的问题,我们要如何解决呢?下面装机之家分享一下Win10提示"由于启动计算机时出现 ...

  7. VsStudio中scanf返回值被忽略的原因及其解决方法

    相信有不少人在使用vs的时候会遇到以下这个问题:scanf返回值被忽略,接下来我就告诉大家该如何解决这个问题 出现问题的原因:   因为scanf()在读取数据时不检查边界,所以可能会造成内存泄漏.M ...

  8. 由于重启计算机出现了页面文件配置问题,Win10提示"由于启动计算机时出现了页面文件配置问题"解决方法...

    我们在使用Windows10系统的过程中,经常会遇到一些问题.近期有一个网友咨询电脑知识大全小编,称自己Windows10系统开机之后,弹出系统属性对话框,提示"由于启动计算机时出现了页面文 ...

  9. 打开图片显示Windows照片查看器无法显示图片。因为计算机上的可用内存可能不足。解决方法!

    打开图片显示Windows照片查看器无法显示图片.因为计算机上的可用内存可能不足.解决方法! 首先,去exiftool(.)org下载个免费的命令行程序exiftool.exe. 然后,用记事本建一个 ...

最新文章

  1. 机器人带陀螺仪走钢丝_Sphero RVR 一个无所不能的可编程机器人!
  2. java jdk 8u111_8u111-jdk-alpine在java开发中的NullPointerException错误解决方案
  3. ionic 定位 android,ionic3定位 (android)
  4. 家属楼如何设置使用免费wifi
  5. [Java网络编程基础]InetAddress的使用
  6. IntelliJ IDEA for Mac 封装字段(添加setter/getter方法)
  7. 在SpringBoot中使用slf4j与logbak
  8. 理解Java操作数据库原理
  9. C#3.0 Sepcification(中英文对照) (转)
  10. java final date_Java 8新特性之Date/Time(八恶人-4)
  11. linux 开机自动运行命令_Linux内核分析-启动顺序、运行级别及开机启动(七)
  12. java编程练习题三
  13. Alex 的 Hadoop 菜鸟教程: 第21课 不只是在HBase中用SQL:Phoenix
  14. 机器人学导论学习笔记No.1-第一章 :概述
  15. Day5-ESP8266模块——百问网7天物联网智能家居
  16. 分页符怎么删除,word不要的页面删不掉
  17. 全球及中国HSK刀柄行业投资态势及前景建议研究报告2022版
  18. Mysql安装错误ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost:3306‘ (10061)
  19. 计算机用户名如何修改,如何修改电脑用户名
  20. Excel数据如何导入到Oracle数据库中

热门文章

  1. 禁用Chrome缓存
  2. 美术理科生能报计算机专业吗,理科艺术生有哪些专业 理科生能报的大学
  3. Android10 insmod源码分析
  4. 媒体利器!最新同义词词库助力创作伪原创
  5. 招商专员笔试题目_招商人员专业试题
  6. PHP-设计模式-外观模式
  7. (JNI/JNA)java 调用c/c++ 动态链接库 全套操作+踩坑集锦
  8. 使用sendmail命令发送附件
  9. IDEA中pom文件变成蜘蛛图标 或者蚂蚁图标 或者pom文件为灰色
  10. ES6——扩展运算符(...)