本方案由 EasyQuant AI量化助手 提供。
问题背景
MACD 是量化策略中常见的趋势与动量指标,由 DIF、DEA 和 MACD 柱状值组成。SuperMind 可以通过历史行情数据计算技术指标,用于研究价格变化和策略信号。
本文使用 Pandas 根据收盘价计算 MACD,适合用于指标研究和回测逻辑编写。
获取历史行情
import pandas as pd
def get_stock_data(stock_code, count=120):
"""
获取历史行情数据
"""
df = get_history(
count=count,
frequency="1d",
field=["open", "high", "low", "close", "volume"],
security_list=[stock_code],
fq="pre"
)
return df
df = get_stock_data("000001.SZ", 120)
print(df.tail())
计算MACD指标
def calculate_macd(stock_code):
df = get_stock_data(stock_code, 120)
if df is None or len(df) < 35:
return None
df = df.copy()
# 计算快速与慢速指数移动平均
ema12 = df["close"].ewm(
span=12,
adjust=False
).mean()
ema26 = df["close"].ewm(
span=26,
adjust=False
).mean()
# DIF
df["DIF"] = ema12 - ema26
# DEA
df["DEA"] = df["DIF"].ewm(
span=9,
adjust=False
).mean()
# MACD柱
df["MACD"] = 2 * (df["DIF"] - df["DEA"])
return df
df = calculate_macd("000001.SZ")
if df is not None:
print(
df[
["close", "DIF", "DEA", "MACD"]
].tail()
)
判断MACD交叉信号
def check_macd_signal(stock_code):
df = calculate_macd(stock_code)
if df is None or len(df) < 2:
return "数据不足"
previous = df.iloc[-2]
current = df.iloc[-1]
# DIF上穿DEA
if (
previous["DIF"] <= previous["DEA"]
and current["DIF"] > current["DEA"]
):
return "DIF上穿DEA"
# DIF下穿DEA
if (
previous["DIF"] >= previous["DEA"]
and current["DIF"] < current["DEA"]
):
return "DIF下穿DEA"
return "无信号"
signal = check_macd_signal("000001.SZ")
print("MACD信号:", signal)
在策略中使用信号
def handle_data(context):
stock_code = "000001.SZ"
signal = check_macd_signal(stock_code)
if signal == "DIF上穿DEA":
print("检测到MACD上穿信号")
elif signal == "DIF下穿DEA":
print("检测到MACD下穿信号")
else:
print("当前无MACD交叉信号")
注意事项
-
MACD 的常用参数为 12、26、9,实际研究可以根据策略需求调整。
-
EMA 初始值会影响指标前期结果,建议准备足够的历史行情数据进行预热。
-
不同平台的 MACD 柱定义可能存在差异,常见计算为
2 × (DIF - DEA)。 -
使用未完成的日 K 线时,盘中指标可能持续变化。
-
示例只展示指标计算和信号判断,不包含实际买卖委托。
-
SuperMind 的具体行情接口、策略生命周期函数和股票代码格式应以当前平台文档为准。
总结
SuperMind 可以利用历史行情计算 MACD 指标,通过 DIF 与 DEA 的交叉判断生成研究信号。结合回测、交易成本和风险控制,可以进一步构建完整的量化策略。

295

被折叠的 条评论
为什么被折叠?



