3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
MACD 柱状图底背离是技术分析中经典的看涨反转信号。当股票价格创出新低,但 MACD 柱状图(绿柱)的低点却比前一次低点抬高时,即形成底背离。本文将介绍如何在 ptrade 量化交易平台中利用内置函数自动识别 MACD 柱状图底背离并执行买入操作。
get_history 获取标的前 N 个交易日的收盘价序列。get_MACD(close_data, 12, 26, 9) 计算 DIF、DEA 及 MACD 柱状图(macd)序列。order_value 全仓买入。def initialize(context):
# 设置监控标的(以恒生电子 600570.SS 为例)
g.security = '600570.SS'
set_universe(g.security)
# 策略全局变量
g.history_count = 100
def handle_data(context, data):
security = g.security
# 1. 获取过去 100 天的收盘价历史数据
df = get_history(g.history_count, '1d', 'close', security_list=security, fq='pre') if df is None or df.empty:
return
# 单只股票返回的是 DataFrame,提取 close 数组
close_data = df['close'].values
# 2. 调用 ptrade 内置 MACD 计算函数
# 返回:dif_data, dea_data, macd_data
macd_dif, macd_dea, macd_bar = get_MACD(close_data, short=12, long=26, m=9)
# 3. 寻找 MACD 绿柱谷底(局部最小值点)
# macd_bar 为负数时代表绿柱
trough_indices = []
for i in range(2, len(macd_bar) - 1):
# 满足局部最小值且为负值(绿柱谷底)
if macd_bar[i] < 0 and macd_bar[i] < macd_bar[i-1] and macd_bar[i] < macd_bar[i+1]:
trough_indices.append(i)
# 如果谷底少于 2 个,无法构成背离比较
if len(trough_indices) < 2:
return
# 获取最近的两个谷底索引
last_trough = trough_indices[-1]
prev_trough = trough_indices[-2]
# 确保最近的谷底刚形成不久(如发生在最近 3 个交易日内),保证时效性
if (len(macd_bar) - 1 - last_trough) > 3:
return
# 4. 判断底背离条件
# 条件 1: 最近谷底的价格低于上一次谷底的价格(价格创新低)
price_condition = close_data[last_trough] < close_data[prev_trough]
# 条件 2: 最近谷底的 MACD 绿柱负值大于上一次谷底(绿柱变短,能量抬升)
macd_condition = macd_bar[last_trough] > macd_bar[prev_trough]
# 5. 执行买入逻辑
cash = context.portfolio.cash
current_position = get_position(security).amount
if price_condition and macd_condition and current_position == 0:
log.info("触发 MACD 柱状图底背离!前谷底价格: %s, 现谷底价格: %s" % (close_data[prev_trough], close_data[last_trough]))
# 全仓买入股票
order_value(security, cash)
get_MACD(close, short=12, long=26, m=9)
(dif, dea, macd) 三个一维 numpy.ndarray 数组。macd 值为柱状图数值,正值为红柱,负值为绿柱。get_history(count, frequency, field, security_list, fq)
fq='pre')收盘价,确保技术指标计算连贯准确。order_value(security, value)
check_limit 与 get_stock_status 过滤停牌或涨跌停标的。order_target(security, 0) 及时平仓,降低风险。