iT邦幫忙

2024 iThome 鐵人賽

DAY 4
0
AI/ ML & Data

打開就會 AI 與數據分析的投資理財術系列 第 4

Day3:數據清洗、處理與技術指標計算

  • 分享至 

  • xImage
  •  

今天我們將學習如何對金融數據進行清洗和處理,以及如何計算一些常用的技術指標(Technical Indicator),這些指標將用於後續的策略分析與開發。今日 Colab 連結

1. 數據清洗與處理

1.1 處理缺失值

在金融數據中,缺失值是常見的問題。缺失值可能來自數據提供商的不完整信息,或者特定交易日無法獲取到數據。首先,我們需要處理這些缺失值。

# 使用 APPLE 股票當例子
stock_data = yf.download('AAPL', start='2022-01-01', end='2023-01-01')

# 檢查數據中是否有缺失值
print(stock_data.isnull().sum())

可以看到他會 summry 出一個結果, 那因為我們的資料沒有問題所以都是 0:
https://ithelp.ithome.com.tw/upload/images/20240918/20120549dlLwim1dv9.png

那如果有問題使用下面兩個方式來解決或者替代 NaN

# 方法一:刪除缺失值
stock_data_cleaned = stock_data.dropna()

# 方法二:使用插值法填補缺失值
stock_data_filled = stock_data.fillna(method='ffill')  # 使用前一個有效數據填補

1.2 處理重複數據

在清理數據時,我們還需要確保數據中沒有重複的記錄。重複數據可能會導致錯誤的分析結果。

# 檢查重複數據
print(stock_data.duplicated().sum())

# 刪除重複數據
stock_data = stock_data.drop_duplicates()

1.3 時間序列處理

金融數據通常是以時間序列的形式呈現。我們需要確保數據按照時間順序排列,並且時間索引是正確的。

# 確認數據按時間順序排列
stock_data = stock_data.sort_index()

# 重新設置時間索引
stock_data.index = pd.to_datetime(stock_data.index)

2. 計算常見技術指標(Technical Indicator)

接下來,我們將計算一些常見的技術指標,這些指標可以幫助你分析市場趨勢並開發投資策略。

2.1 移動平均線 (Moving Averages)

移動平均線是技術分析中的基本指標,反映了某一段時間內的平均價格。常見的有簡單移動平均線 (SMA) 和指數移動平均線 (EMA)。

# 計算 50 天簡單移動平均線 (SMA)
stock_data['SMA_50'] = stock_data['Adj Close'].rolling(window=50).mean()

# 計算 200 天簡單移動平均線 (SMA)
stock_data['SMA_200'] = stock_data['Adj Close'].rolling(window=200).mean()

# 計算 50 天指數移動平均線 (EMA)
stock_data['EMA_50'] = stock_data['Adj Close'].ewm(span=50, adjust=False).mean()

print(stock_data)

順利執行時應該可見下面結果, 可以看到原本的資料中多了新的 coloum, 這邊特別注意一下因為 50 天跟 200 天需要累機夠足夠天數才能算, 所以他們前面都會是 NaN
https://ithelp.ithome.com.tw/upload/images/20240918/20120549Mj1uvMUFGH.png

2.2 相對強弱指數 (RSI)

RSI 是衡量價格變動速度和變動量的技術指標,通常用來判斷市場是否處於超買或超賣狀態。

def calculate_RSI(data, window=14):
    delta = data['Adj Close'].diff(1)
    gain = delta.where(delta > 0, 0)
    loss = -delta.where(delta < 0, 0)

    avg_gain = gain.rolling(window=window).mean()
    avg_loss = loss.rolling(window=window).mean()

    rs = avg_gain / avg_loss
    rsi = 100 - (100 / (1 + rs))
    return rsi

# 計算 14 天 RSI
stock_data['RSI_14'] = calculate_RSI(stock_data, window=14)
print(stock_data['RSI_14'])

完成可見:
https://ithelp.ithome.com.tw/upload/images/20240918/2012054942bnPQK3ps.png

2.3 移動平均收斂散度 (MACD)

MACD 是常見的動量指標,用於衡量兩條不同周期的移動平均線之間的差異。常常聽到的黃金交叉(MACD 超過訊號線)買進或者死亡交叉(MACD 跌破訊號線)賣出。

# 計算 MACD
stock_data['MACD'] = stock_data['Adj Close'].ewm(span=12, adjust=False).mean() - stock_data['Adj Close'].ewm(span=26, adjust=False).mean()

# 計算信號線 (Signal Line)
stock_data['Signal Line'] = stock_data['MACD'].ewm(span=9, adjust=False).mean()
print(stock_data[['MACD','Signal Line']])

可得:
https://ithelp.ithome.com.tw/upload/images/20240918/20120549zHXpvPqCYp.png

2.4 波動率 (Volatility)

波動率衡量價格變動的劇烈程度,是風險管理中的重要指標之一。

# 計算 20 天滾動標準差來估計波動率
stock_data['Volatility_20'] = stock_data['Adj Close'].rolling(window=20).std()

print(stock_data['Volatility_20'])

可得:
https://ithelp.ithome.com.tw/upload/images/20240918/20120549gWtjo4VKrL.png

3. 視覺化財務指標

3.1 視覺化移動平均線 (SMA、EMA)

我們可以將計算出的移動平均線疊加在價格走勢圖上,以幫助分析趨勢。

plt.figure(figsize=(10, 6))
plt.plot(stock_data['Adj Close'], label='AAPL Adj Close', color='blue')
plt.plot(stock_data['SMA_50'], label='50天SMA', color='orange')
plt.plot(stock_data['SMA_200'], label='200天SMA', color='green')
plt.title('AAPL 調整後收盤價與移動平均線')
plt.xlabel('日期')
plt.ylabel('價格')
plt.legend()
plt.grid(True)
plt.show()

得到圖形如下:
https://ithelp.ithome.com.tw/upload/images/20240918/201205493bxH688e36.png

3.2 視覺化 RSI

RSI 可以幫助你判斷超買或超賣的情況。例如 當 RSI 大於 70 時,市場可能超買;當 RSI 小於 30 時,市場可能超賣。

plt.figure(figsize=(10, 6))
plt.plot(stock_data['RSI_14'], label='14天 RSI', color='purple')
plt.axhline(70, linestyle='--', color='red', label='超買線 (70)')
plt.axhline(30, linestyle='--', color='green', label='超賣線 (30)')
plt.title('AAPL 14天 RSI')
plt.xlabel('日期')
plt.ylabel('RSI')
plt.legend()
plt.grid(True)
plt.show()

得到圖形如下:
https://ithelp.ithome.com.tw/upload/images/20240918/20120549nSICLj4pGx.png

3.3 視覺化 MACD 與信號線

MACD 與信號線的交叉常常用作買入或賣出的信號。如下方MACD 超過訊號線時可以買進或者MACD 跌破訊號線可以賣出

plt.figure(figsize=(10, 6))
plt.plot(stock_data['MACD'], label='MACD', color='blue')
plt.plot(stock_data['Signal Line'], label='信號線', color='red')
plt.title('AAPL MACD 與信號線')
plt.xlabel('日期')
plt.ylabel('MACD')
plt.legend()
plt.grid(True)
plt.show()

得到圖形如下:
https://ithelp.ithome.com.tw/upload/images/20240918/20120549KBTO3XGcVn.png

4. 第三天任務

  • 清洗數據:處理缺失值和重複數據,確保數據的完整性。
  • 計算財務指標:計算移動平均線 (SMA、EMA)、RSI、MACD 和波動率。
  • 視覺化財務指標:繪製調整後收盤價與指標的圖形,分析趨勢和市場狀況。

通過這些步驟,你將學會如何清洗和處理數據,並計算常用的技術指標,這些技能將幫助你進行更深入的策略分析和開發。


上一篇
Day2:獲取金融數據
下一篇
Day4:金融指標計算與策略開發基礎
系列文
打開就會 AI 與數據分析的投資理財術30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言