BigQuant使用文档

117b-基于MACD指标的事件策略

由small_q创建,最终由qxiao 被浏览 189 用户

策略介绍

该策略是一个典型的事件策略,事件策略和选股策略是有本质上的区别的,事件策略的基本思想是,对于特定的股票,什么时候该买,什么时候该卖,本文介绍了一种基于MACD指标的事件策略

具体来说,MACD包括三个指标:

  • MACD(平滑异同移动平均线):MACD线是短期指数移动平均线(通常是12天EMA)与长期指数移动平均线(通常是26天EMA)之间的差值,反映了短期价格动量相对于长期价格动量的变化
  • Signal(信号线):信号线是MACD线的9天指数移动平均线(9天EMA),用于平滑MACD线的波动,信号线的交叉情况常用于生成买卖信号
  • Histogram(差离值):差离值是MACD线与信号线之间的差值,通常以柱状图的形式表示,差离值用于显示MACD线和信号线之间的距离和方向,反映价格动量的变化

基于MACD指标事件策略的基本思路是:

  • 当MACD线从下方向上穿过信号线时,通常被认为是买入信号,表明价格可能开始上升
  • 当MACD线从上方向下穿过信号线时,通常被认为是卖出信号,表明价格可能开始下跌

策略流程

  1. 只选贵州茅台(600519.SH)一只股票,回测时间为2019-01-01至2024-04-30
  2. 当贵州茅台的MACD线从下方向上穿过信号线时,全仓买入;当贵州茅台的MACD线从上方向下穿过信号线时,全仓卖出

策略实现

  1. 由于不涉及选股,因此在这个策略中,我们只需要“输入特征(DAI SQL)”模块、“数据抽取”模块、和“BigTrader”模块,不需要“A股股票过滤”和“仓位分配”模块
  2. 在“输入特征(DAI SQL)”模块的“表达式过滤条件”一栏中,我们输入instrument=’600519.SH’表示只看茅台这一只股票
  3. 在“输入特征(DAI SQL)”模块的“表达式特征”一栏中,我们输入:
  • m_ta_macd_dea(close) AS macdm_ta_macd_dif(close) AS sig,分别提取出MACD线和信号线
  • IF(macd < sig AND m_lag(macd,1) > m_lag(sig, 1), 1, 0) AS buy_signal,表示今天的MACD线小于信号线,但是昨天的MACD线还是大于信号线的,这就是一个下穿的表现,我们将出现下穿记为1,否则为0,这就是买入信号
  • IF(macd > sig AND m_lag(macd,1) < m_lag(sig, 1), 1, 0) AS sell_signal,表示今天的MACD线大于信号线,但是昨天的MACD线还是小于信号线的,这就是一个上穿的表现,我们将出现上穿记为1,否则为0,这就是卖出信号

\

  1. 在“数据抽取”模块中输入开始时间2019-01-01和结束时间2024-04-30

\

  1. 在“BigTrader”模块中的“K线处理函数”中,编辑下单逻辑:
  • 首先,读取今日数据,如果今日数据缺失,则直接返回
    # 获取当前日期
    current_date = data.current_dt.strftime("%Y-%m-%d")
    
    # 获取当日数据
    current_day_data = context.data[context.data["date"] == current_date]

    if len(current_day_data) == 0:
        return
  • 接着从今日数据中提取出买卖信号,并且提取出股票代码(本例中为茅台600519.SH)
    buy_sig = current_day_data['buy_signal'].iloc[0]
    sell_sig = current_day_data['sell_signal'].iloc[0]
    ins = current_day_data['instrument'].iloc[0]
  • 最后,判断,如果有卖出信号并且仓内有茅台,就卖出茅台;如果有买入信号并且仓内没茅台,就买入茅台
    # 获取当前已持有股票
    current_hold_instruments = set(context.get_account_positions().keys())

    # 若长线大于短线且有持仓
    if sell_sig == 1 and ins in current_hold_instruments:
        context.order_target(ins, 0)

    # 若短线大于长线且没有持仓
    if buy_sig == 1 and ins not in current_hold_instruments:
        context.order_target_percent(ins, 1)

策略源码

https://bigquant.com/codesharev3/0ea99681-29f8-49ab-91a3-7401b0e978b9

\

标签

股票交易
评论
  • 当MACD线从上方向下穿过信号线时,通常被认为是卖出信号,表明价格可能开始下跌
  • 下穿不是卖出吗?为什么代码里又是买入信号了?不是很理解
  • IF(macd < sig AND m_lag(macd,1) > m_lag(sig, 1), 1, 0) AS buy_signal
{link}