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窗口大小,默認為12long: int,長期EMA窗口大小,默認為26mid: int,DEA線EMA窗口大小,默認為9返回:tuple,包含dif、dea、macd指標值的元組"""dif = EMA(close, short) - EMA(close, long)dea = EMA(dif, mid)macd = (dif - dea) * 2return 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窗口大小,默認為12long: int,長期EMA窗口大小,默認為26mid: int,DEA線EMA窗口大小,默認為9返回:tuple,包含dif、dea、macd指標值的元組"""dif = EMA(close, short) - EMA(close, long)dea = EMA(dif, mid)macd = (dif - dea) * 2return dif, dea, macddef c_one_m(close_prices):"""計算MACD指標的dif、dea、macd參數:close_prices: list,收盤價數據列表返回:tuple,包含dif、dea、macd指標值的元組"""short_window = 12long_window = 26mid_window = 9close_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指標的DataFrameday_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)