上一篇我們已經可以透過FinMind API下載價量資料了 ,本篇我們來說說如何透過這些取得的資料去加以計算均線等數據方便我們找出葛蘭碧突破的股票。
均線大概可以分成三種,計算方式不同,靈敏度也不一樣:
SMA(簡單移動平均線)
這是最常見、也是計算最簡單的均線。通常報價軟體預設的均線就是這種。它的計算方式是把選定區間內的數值全部加起來,然後除以總天數。也就是說,每天的價格權重都一樣。
EMA(指數移動平均線)
EMA給最近的價格更高的權重,反應比較快。它的計算方法是,越近期的價格權重越高,依照指數方式往前遞減,所以比SMA更靈敏。
WMA(加權移動平均線)
WMA同樣給近期價格更大的權重,但跟EMA不同的是,它的權重是用等差方式逐步遞減。也就是說,最近的價格權重大,越往前,權重越小。
每種均線都有其特定的應用情境,而我們在找葛蘭碧突破的股票時,我們只需要用到SMA就好,所以後面我們所提到的均線都是指SMA。
接下來我們實際在程式上呈現均線的計算。計算均線我們有一個參數可以調整,也就是均線長度(MA Length),我們先以MA50來選寫一個簡單的均線計算程式:
我們今天一樣以台積電(2330)的股價為例,上一篇我們將股價儲存為csv格式,csv格式如下:
date | stock_id | Trading_Volume | Trading_money | open | max | min | close | spread | Trading_turnover |
---|---|---|---|---|---|---|---|---|---|
2020-01-02 | 2330 | 33,282,120 | 11,224,165,450 | 332.5 | 339.0 | 332.5 | 339.0 | 8.0 | 17,160 |
2020-01-03 | 2330 | 42,023,268 | 14,295,651,580 | 344.0 | 345.0 | 335.5 | 339.5 | 0.5 | 20,545 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2024-09-16 | 2330 | 14,456,888 | 13,692,259,575 | 952.0 | 952.0 | 943.0 | 947.0 | 0.0 | 26,421 |
2024-09-18 | 2330 | 30,094,662 | 28,303,054,525 | 945.0 | 948.0 | 933.0 | 941.0 | -6.0 | 46,622 |
在計算均線我們只需要用收盤價close
去計算即可,將close
欄位做MA的計算:
import pandas as pd
# Read Your CSV
df = pd.read_csv(r'C:\iThome\TSMC_stock_data.csv')
def calculate_ma(data, window):
return data.rolling(window=window).mean()
ma_window = 50 # MA Length
df[f'MA_{ma_window}'] = calculate_ma(df['close'], ma_window)
df.to_csv('TSMC_stock_data_with_MA.csv', index=False)
這樣我們就多了一個可以看到MA_50
欄位的csv了:
date | stock_id | Trading_Volume | Trading_money | open | max | min | close | spread | Trading_turnover | MA_50 |
---|---|---|---|---|---|---|---|---|---|---|
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2024-09-13 | 2330 | 28,307,441 | 26,795,862,243 | 955.0 | 955.0 | 939.0 | 947.0 | 7.0 | 39,071 | 955.88 |
2024-09-16 | 2330 | 14,456,888 | 13,692,259,575 | 952.0 | 952.0 | 943.0 | 947.0 | 0.0 | 26,421 | 954.72 |
2024-09-18 | 2330 | 30,094,662 | 28,303,054,525 | 945.0 | 948.0 | 933.0 | 941.0 | -6.0 | 46,622 | 953.44 |
有了以上計算均線之方法我們可以來嘗試找出葛蘭碧突破的日期了,這邊我們需要考慮兩個參數:
由於這兩個參數並沒有一定要使用什麼值,所以我們先把這兩個參數固定為:
再來就可以開始實作我們的程式了:
import pandas as pd
# Read CSV
df = pd.read_csv(r'C:\iThome\your_csv_file_with_MA.csv')
df['avg_volume_10d'] = df['Trading_Volume'].rolling(window=10).mean()
# Condition 1: Current closing price breaks above a declining MA50
df['ma50_trend'] = df['MA_50'].diff()
df['price_above_ma50'] = (df['close'] > df['MA_50']) & (df['ma50_trend'] < 0)
# Condition 2: Current trading volume is greater than 1.5 times the 10-day average volume
df['volume_spike'] = df['Trading_Volume'] > (1.5 * df['avg_volume_10d'])
granville_breakout = df[(df['price_above_ma50']) & (df['volume_spike'])]
breakout_dates = granville_breakout['date'].tolist()
print("Granville breakout dates:", breakout_dates)
以上程式輸出出來的日期我們可以到任何看盤軟體上確認他是否符合條件,這邊我以其中一個突破日期"2023-10-11"在XQ上確認看看:
我們已經完成了葛蘭碧突破篩選的濾網了,接著就可以將台股過去的所有標符合葛蘭碧突破的日期都找出來進一步去分析了!