MACD日回测代码以及MACD的计算方法

开始学习期货的量化交易,从米筐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)
  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在bacdtrader回测中,可以通过以下方式表示当前金叉[]上一个MACD金叉[-1]: 1. 首先,需要使用MACD指标来计算出金叉的位置。 2. 然后,可以使用bacdtrader回测中的函数来获取当前金叉的位置,如:current_cross = bt.CrossUp(macd, signal)。 3. 最后,可以使用bacdtrader回测中的函数来获取上一个MACD金叉的位置,如:last_cross = bt.PrevNthCrossUp(macd, signal, -1)。 这样就可以得到当前金叉[]上一个MACD金叉[-1]的位置了。 ### 回答2: 在bacdtrader回测中,要表示当前金叉[0]和上一个MACD金叉[-1],可以通过以下方法实现。 首先,bacdtrader回测是一种金叉死叉策略,其中MACD金叉是指导入的技术指标中的两条线(快线和慢线)穿越零轴向上的情况。根据这个定义,就可以编写一段代码来表示当前金叉。 其次,要表示上一个MACD金叉,需要获取之前的金叉出现的时间点。这可以通过使用bacdtrader提供的时间戳来实现。可以编写一段代码来追溯上一个金叉的时刻,并将其表示出来。 总的来说,通过在bacdtrader回测中编写相应的代码,可以很方便地表示当前金叉[0]和上一个MACD金叉[-1]。这样可以帮助我们分析和理解金叉死叉策略的表现,并做出相应的调整和决策。 ### 回答3: bacdtrader回测是一种用于股票或其他金融资产的流行的技术分析工具。它主要用来判断买入和卖出时机,通过比较不同指标的数值来预测市场走势。 在bacdtrader回测中,当前金叉表示当短期移动平均线(MACD)上穿长期移动平均线,这通常是一个买入信号。而上一个MACD金叉则是指上一个时间段内发生的短期移动平均线上穿长期移动平均线。 要用bacdtrader回测来表示当前金叉[0]上一个MACD金叉[-1],我们可以利用bacdtrader提供的函数和条件语句来实现。首先,我们可以使用函数来计算当前和前一个时间段的MACD数值。然后,使用条件语句来判断当前时间段的MACD是否上穿了长期移动平均线,如果是则表示金叉[0],进而再判断上一个时间段的MACD是否上穿了长期移动平均线,如果是则表示上一个MACD金叉[-1]。 具体的代码可能如下所示: current_MACD = calculate_MACD(current_time) # 计算当前时间段的MACD数值 previous_MACD = calculate_MACD(previous_time) # 计算上一个时间段的MACD数值 if current_MACD > long_term_MA and current_MACD > short_term_MA: # 判断当前金叉[0] if previous_MACD > long_term_MA and previous_MACD > short_term_MA: # 判断上一个MACD金叉[-1] print("当前金叉[0]上一个MACD金叉[-1]") else: print("当前金叉[0],但上一个MACD未金叉[-1]") else: print("当前未金叉[0]") 需要注意的是,以上代码仅是一个简单的示例,实际使用时可能需要根据具体的bacdtrader回测工具的文档和指标定义进行调整。另外,具体的计算方法和条件判断也可能会因不同的技术分析策略而有所不同,需要根据具体情况进行修改和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值