金字塔决策交易系统

 找回密码
 

微信登录

微信扫一扫,快速登录

搜索
查看: 2041|回复: 3

关于python回测时如何取macd值的问题

[复制链接]

19

主题

70

帖子

70

积分

等级: 免费版

注册:
2023-1-30
曾用名:
发表于 2023-7-18 21:55 | 显示全部楼层 |阅读模式
我写的代码:
    K线数量 =500#越多误差越小,最少34
    #MACD1
    MACD1 = get_indicator("SH510050", 'MACD','MACD1', '26,12,9', 'self', K线数量)[-1]#提取pel公式指标数据
    print(f'MACD1:{MACD1}')#最后一个:[-0.00012215]

    #MACD5
    MACD5 = get_indicator("SH510050", 'MACD','MACD1', '26,12,9', '5m', K线数量)[-1]#提取pel公式指标数据
    print(f'MACD5:{MACD5}')


结果:
21:48:02 > 刷新时间:2023-07-03 09:31:00
21:48:02 > MACD1:0.0
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:32:00
21:48:02 > MACD1:0.000382908660801462
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:33:00
21:48:02 > MACD1:0.0007295890369225333
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:34:00
21:48:02 > MACD1:0.0009060997101680926
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:35:00
21:48:02 > MACD1:0.0013475418055018792
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:36:00
21:48:02 > MACD1:0.002184107923264454
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:37:00
21:48:02 > MACD1:0.0032194674908173834
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:38:00
21:48:02 > MACD1:0.003934935634237141
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:39:00
21:48:02 > MACD1:0.0038928623255794423
21:48:02 > MACD5:0.0
21:48:02 > 刷新时间:2023-07-03 09:40:00
21:48:02 > MACD1:0.003624592226533746
21:48:02 > MACD5:0.001276352059128527



为何前面那么多值为零?
我因该如何取2023-07-03 09:31:00  的macd一分钟周期值?
我因该如何取2023-07-03 09:36:00  的macd五分钟周期值?

谢谢!


补充内容 (2023-7-18 22:00):
我还试过用talib,但是做不到和金字塔数据一样。金字塔的标准是什么,如何设置才能做到一样?
回复

使用道具 举报

19

主题

70

帖子

70

积分

等级: 免费版

注册:
2023-1-30
曾用名:
 楼主| 发表于 2023-7-18 22:01 | 显示全部楼层
我写的代码。烦请技术帮忙斧正,感激不尽。
from PythonApi import *
import talib
import numpy as np

def init(context):
    #收盘价获取
    #股票代码 = context.run_info.base_book_id
    股票代码 = "sz301357"
    #print(股票代码)#SH510050
    K线数量 =500#越多误差越小,最少34
    收盘价 = history_bars(股票代码, K线数量, 'self', 'close',True)#某一合约历史数据
    #print(收盘价)
    if len(收盘价) < 34 :
        print('K线数量不足')
        
    #talib.MACDEXT不同类型:
   
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, slowperiod = 26, signalperiod = 9)
    print(f'默认是0:\n{macd}') #1.05220566e-01
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=0,slowperiod = 26, slowmatype=0, signalperiod = 9,signalmatype=0)
    print(f'0:SMA:\n{macd}')#1.05220566e-01
   
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=1,slowperiod = 26, slowmatype=1, signalperiod = 9,signalmatype=1)
    print(f'1:EMA:\n{macd}')#7.09681680e-02
    diff,dea,macd = talib.MACD(收盘价 , fastperiod = 12, slowperiod = 26, signalperiod = 9)#______________MACD_____________
    print(f'___MACD___:\n{macd}') #7.09681680e-02
   
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=2,slowperiod = 26, slowmatype=2, signalperiod = 9,signalmatype=2)
    print(f'2:WMA:\n{macd}')#9.71633499e-02
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=3,slowperiod = 26, slowmatype=3, signalperiod = 9,signalmatype=3)
    print(f'3:DEMA:\n{macd}')#0.03097076
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=4,slowperiod = 26, slowmatype=4, signalperiod = 9,signalmatype=4)
    print(f'4:TEMA:\n{macd}') #-3.41443015e-02
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=5,slowperiod = 26, slowmatype=5, signalperiod = 9,signalmatype=5)
    print(f'5:TRIMA:\n{macd}')#2.05966702e-01
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=6,slowperiod = 26, slowmatype=6, signalperiod = 9,signalmatype=6)
    print(f'6:KAMA:\n{macd}')#5.62658020e-02
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=7,slowperiod = 26, slowmatype=7, signalperiod = 9,signalmatype=7)
    print(f'7:MAMA:\n{macd}') #0
    diff,dea,macd = talib.MACDEXT(收盘价 , fastperiod = 12, fastmatype=8,slowperiod = 26, slowmatype=8, signalperiod = 9,signalmatype=8)
    print(f'8:T3:\n{macd}')#1.05628403e-01
   
    #金字塔
    提取pel公式指标数据 = get_indicator(股票代码, 'MACD','MACD1', '26,12,9', 'self', K线数量)
    print(f'公式输出:\n{提取pel公式指标数据}')#1.41936336e-01  #0.0421463077e
    #通达信:越多误差越小:-0.05                                #0.042149        金字塔通达信误差很小
回复

使用道具 举报

19

主题

1万

帖子

1万

积分

Rank: 8Rank: 8

等级: 超级版主

注册:
2021-5-18
曾用名:
FireScript
发表于 2023-7-19 16:27 | 显示全部楼层
本帖最后由 技术009 于 2023-7-19 17:23 编辑

金字塔里默认的macd都是使用的ema均线来计算的。

你这里fastmatype,slowmatype  应该都使用ema的才是和金字塔macd指标算法是一致的,也就是参数为1的时候。但是有些差异的地方在于初始值的处理上,py库里的处理在数据不足时候值其实是为nan的,而金字塔下目前计算这个的处理 是数据不足时候其实并不为无效值.你可以看下macd指标在第一个K还是有值,值为0.  这就是偏差的来源,在数据量够大的时候这个偏差会很小。这个没有对错之分,就是选择的问题了。
你用我的这个试下:

#计算MACD指标   
def calculate_macd(data, fast_period=12, slow_period=26, signal_period=9):   
    df = pd.DataFrame(data,columns=['close'])
    # 计算快速线(DIF)
    fast_ema = df['close'].ewm(span=fast_period, adjust=False).mean()
    slow_ema = df['close'].ewm(span=slow_period, adjust=False).mean()
    dif = fast_ema - slow_ema   
    # 计算慢速线(DEA)
    dea = dif.ewm(span=signal_period, adjust=False).mean()   
    macd = (dif - dea) * 2   
    return dif.values, dea.values, macd.values

我之前测试下来是一样的。这个方式偏差极小。


金字塔提供一对一VIP专业技术指导服务,技术团队实时响应您的日常使用问题与策略编写。联系电话:021-20339086
回复

使用道具 举报

19

主题

70

帖子

70

积分

等级: 免费版

注册:
2023-1-30
曾用名:
 楼主| 发表于 2023-7-21 13:15 | 显示全部楼层
技术009 发表于 2023-7-19 16:27
金字塔里默认的macd都是使用的ema均线来计算的。

你这里fastmatype,slowmatype  应该都使用ema的才是和 ...

谢谢,按您的方法弄好了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 微信登录

本版积分规则

手机版|小黑屋|上海金之塔信息技术有限公司 ( 沪ICP备13035422号 )

GMT+8, 2024-11-16 12:46 , Processed in 0.243356 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表