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线从上方向下穿过信号线时,通常被认为是卖出信号,表明价格可能开始下跌
策略流程
- 只选贵州茅台(600519.SH)一只股票,回测时间为2019-01-01至2024-04-30
- 当贵州茅台的MACD线从下方向上穿过信号线时,全仓买入;当贵州茅台的MACD线从上方向下穿过信号线时,全仓卖出
策略实现
- 由于不涉及选股,因此在这个策略中,我们只需要“输入特征(DAI SQL)”模块、“数据抽取”模块、和“BigTrader”模块,不需要“A股股票过滤”和“仓位分配”模块
- 在“输入特征(DAI SQL)”模块的“表达式过滤条件”一栏中,我们输入
instrument=’600519.SH’
表示只看茅台这一只股票 - 在“输入特征(DAI SQL)”模块的“表达式特征”一栏中,我们输入:
m_ta_macd_dea(close) AS macd
与m_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,这就是卖出信号
\
- 在“数据抽取”模块中输入开始时间2019-01-01和结束时间2024-04-30
\
- 在“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
\