3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
其实并不是没有人做,而是纯粹依赖“MACD 0轴上二次金叉”作为单一买入信号的量化策略,在实盘和长期回测中往往表现不佳。网上流传的“黄金买点”更多是基于人工看盘时的“幸存者偏差”(人们往往只记住成功的案例,而忽略了失败的案例)。
在量化交易中,这个策略存在以下几个致命的弱点:
虽然纯策略不完美,但我们可以将其作为一个基础信号进行测试。以下是在 JoinQuant 平台实现“MACD 0轴上金叉”的基础框架(为了简化,这里以0轴上金叉为例,二次金叉需要引入更复杂的状态记录):
# 导入聚宽函数库
import jqdata
import talib
import numpy as np
def initialize(context):
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 股票类每笔交易时的手续费
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
# 设定要操作的股票池(例如:平安银行)
g.security = '000001.XSHE'
# 运行函数
run_daily(market_open, time='09:30')
def market_open(context):
security = g.security
# 获取过去 40 天的收盘价数据来计算 MACD
# MACD 默认参数为 12, 26, 9,需要足够的数据预热
close_data = attribute_history(security, 60, '1d', ['close'], df=False)
close_prices = close_data['close']
if len(close_prices) < 60:
return
# 使用 talib 计算 MACD
macd, macdsignal, macdhist = talib.MACD(close_prices, fastperiod=12, slowperiod=26, signalperiod=9)
# 获取昨日和前日的 DIF (macd) 和 DEA (macdsignal)
dif_yesterday = macd[-1]
dea_yesterday = macdsignal[-1]
dif_before_yesterday = macd[-2]
dea_before_yesterday = macdsignal[-2]
# 判断条件:
# 1. 0轴之上:昨日 DIF > 0 且 DEA > 0
# 2. 金叉:前日 DIF < DEA,昨日 DIF > DEA
is_above_zero = (dif_yesterday > 0) and (dea_yesterday > 0)
is_golden_cross = (dif_before_yesterday < dea_before_yesterday) and (dif_yesterday > dea_yesterday)
# 取得当前的现金
cash = context.portfolio.available_cash
current_position = context.portfolio.positions[security].closeable_amount
# 买入逻辑
if is_above_zero and is_golden_cross and cash > 0:
order_value(security, cash)
log.info("MACD 0轴上金叉,买入 %s" % security)
# 卖出逻辑:死叉卖出
is_dead_cross = (dif_before_yesterday > dea_before_yesterday) and (dif_yesterday < dea_yesterday)
if is_dead_cross and current_position > 0:
order_target(security, 0)
log.info("MACD 死叉,卖出 %s" % security)
如果你想把这个思路做成一个能赚钱的策略,必须进行多因子叠加和过滤: