Python实现MACD工具判断信号:股票技术分析的工具系列(1)
- 介绍
- 代码
- rolling函数介绍
- 核心代码
- 计算指数移动平均值
- 计算MACD指标
- 完整代码
介绍
先看看官方介绍:
MACD (平滑异同平均线)
指标说明
DIF线:收盘价短期、长期指数平滑移动平均线间的差;
DEA线:DIF线的M日指数平滑移动平均线;
MACD线:DIF线与DEA线的差,彩色柱状线;
参数:SHORT(短期)、LONG(长期)、M 天数,一般为12、26、9。
用法
1.DIF、DEA均为正,DIF向上突破DEA,买入信号;
2.DIF、DEA均为负,DIF向下跌破DEA,卖出信号;
3.DEA线与K线发生背离,行情反转信号;
4.分析MACD柱状线,由红变绿(正变负),卖出信号;由绿变红,买入信号。
算法解释:
DIF:EMA(CLOSE,SHORT)-EMA(CLOSE,LONG);
DEA:EMA(DIF,MID);
MACD:(DIF-DEA)*2,COLORSTICK;
优势:
优势 | 描述 |
---|---|
趋势跟踪能力强 | MACD能够帮助识别市场的趋势方向,尤其是短期和长期趋势的转折点。通过观察DIF和DEA线的交叉,可以提供买入和卖出的时机。 |
清晰的信号 | MACD的交叉点和柱状线的变化提供了清晰的交易信号,使得投资者能够更容易地进行决策。 |
背离信号 | 当DEA线与价格走势产生背离时,往往暗示着市场趋势即将发生变化,这为投资者提供了及时的行动信号。 |
柱状线变化反映市场动能 | MACD柱状线的颜色变化反映了市场的动能变化,红色代表正能量增强,绿色代表负能量增强,这有助于投资者了解市场情绪和力量的变化。 |
劣势:
劣势 | 描述 |
---|---|
滞后性 | MACD是一种滞后指标,它基于移动平均线的计算,因此在市场趋势发生变化之后才会发出信号,有时可能会错过市场的最佳买入或卖出时机。 |
假信号 | 由于MACD的计算方式,有时会出现假信号,即在市场波动较大或横盘震荡时,可能会产生交叉但并未发生实际的趋势转折。 |
单一性 | MACD虽然能够提供趋势判断和交易信号,但它并不能完全覆盖市场的全部信息,投资者在使用时仍需要结合其他指标和技术分析方法进行综合判断。 |
代码
rolling函数介绍
rolling
函数通常与其他函数(如 mean
、sum
、std
等)一起使用,以计算滚动统计量,例如滚动均值、滚动总和等。
以下是 rolling
函数的基本语法:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
window
: 用于计算统计量的窗口大小。min_periods
: 每个窗口最少需要的非空观测值数量。center
: 确定窗口是否居中,默认为False
。win_type
: 窗口类型,例如None
、boxcar
、triang
等,默认为None
。on
: 在数据帧中执行滚动操作的列,默认为None
,表示对整个数据帧执行操作。axis
: 执行滚动操作的轴,默认为0
,表示按列执行操作。closed
: 确定窗口的哪一端是闭合的,默认为None
。
核心代码
计算指数移动平均值
计算指数移动平均值是一种技术分析方法,用于平滑数据序列并识别趋势,通过赋予最新数据更高的权重,以更快地反映市场变化。
def EMA(data, window):
"""
计算指数移动平均值
参数:
data: pandas.Series,输入数据
window: int,窗口大小
返回:
pandas.Series,指数移动平均值
"""
return data.ewm(span=window, min_periods=window, adjust=False).mean()
计算MACD指标
MACD指标(Moving Average Convergence Divergence)是一种技术分析工具,通过计算两个移动平均线的差值,并将其绘制成柱状图,来帮助识别市场趋势的变化和买卖信号。
def MACD(close, short=12, long=26, mid=9):
"""
计算MACD指标
参数:
close: pandas.Series,收盘价数据
short: int,短期EMA窗口大小,默认为12
long: int,长期EMA窗口大小,默认为26
mid: int,DEA线EMA窗口大小,默认为9
返回:
tuple,包含dif、dea、macd指标值的元组
"""
dif = EMA(close, short) - EMA(close, long)
dea = EMA(dif, mid)
macd = (dif - dea) * 2
return dif, dea, macd
完整代码
这里完整代码中的data部分,阔以通过下面资源文件下载,或者留下邮箱等发送。:
https://download.csdn.net/download/qq_36051316/88896567
import pandas as pd
import stock_data
# 将股票数据存储到字典中
data = {
'DATE': stock_data.DATE,
'CLOSE': stock_data.CLOSE,
'HIGH': stock_data.HIGH,
'LOW': stock_data.LOW,
'OPEN': stock_data.OPEN,
'CHANGE': stock_data.CHANGE,
'VOL': stock_data.VOL,
'CAPITAL': stock_data.CAPITAL
}
# 创建DataFrame
df = pd.DataFrame(data)
def EMA(data, window):
"""
计算指数移动平均值
参数:
data: pandas.Series,输入数据
window: int,窗口大小
返回:
pandas.Series,指数移动平均值
"""
return data.ewm(span=window, min_periods=window, adjust=False).mean()
def MACD(close, short=12, long=26, mid=9):
"""
计算MACD指标
参数:
close: pandas.Series,收盘价数据
short: int,短期EMA窗口大小,默认为12
long: int,长期EMA窗口大小,默认为26
mid: int,DEA线EMA窗口大小,默认为9
返回:
tuple,包含dif、dea、macd指标值的元组
"""
dif = EMA(close, short) - EMA(close, long)
dea = EMA(dif, mid)
macd = (dif - dea) * 2
return dif, dea, macd
def c_one_m(close_prices):
"""
计算MACD指标的dif、dea、macd
参数:
close_prices: list,收盘价数据列表
返回:
tuple,包含dif、dea、macd指标值的元组
"""
short_window = 12
long_window = 26
mid_window = 9
close_series = pd.Series(close_prices)
return MACD(close_series, short_window, long_window, mid_window)
def check_signal(v_df, day_index=-1):
"""
检查MACD信号
参数:
v_df: pandas.DataFrame,包含MACD指标的DataFrame
day_index: int,要检查的日期索引,默认为最后一天
返回:
str,表示MACD信号的字符串,可能为"买入信号"、"卖出信号"或"无信号"
"""
latest_data = v_df.iloc[day_index]
if latest_data['dif'] > 0 and 0 < latest_data['dea'] < latest_data['dif']:
signal = "买入信号"
elif latest_data['dif'] < 0 and 0 > latest_data['dea'] > latest_data['dif']:
signal = "卖出信号"
else:
signal = "无信号"
return signal
# 计算并添加MACD指标到DataFrame中
dif, dea, m = c_one_m(stock_data.CLOSE)
df['dif'] = dif
df['dea'] = dea
df['m'] = m
# 输出信号
latest_signal = check_signal(df, -1)
print(latest_signal)