量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。
RSI是Relative Strength Index的縮寫,1978年由Wells Wilder發明,是用來衡量過去一段時間內,投資標的漲跌趨勢的相對指標,Relative這個字代表的是,它是以過去這段時間內的上漲量對比下跌量,或者我們也可以說是買盤與賣盤的相對強弱,因此是一個相對的概念。
RSI = 100 × 前N日漲幅的平均值 ÷ ( 前N日漲幅的平均值 + 前N日跌幅的平均值 )
從上面這個公式可以觀察到,由於我們是計算漲或是跌的"幅度",因此都是取絕對值,數字都是大於0的,所以RSI這個數字一定會介在0~100中間。
設想幾個情況喔:
相信到了這邊,我們對RSI的理解就有初步的認識。
下面會教大家怎麼從收盤價的時間序列資料,計算出對應的RSI值:
# 串接tiingo api獲取資料
import os
import pandas_datareader as pdr
SPY = pdr.get_data_tiingo('SPY', api_key='YOUR API KEY')
SPY = SPY.reset_index(level=[0,1])
SPY.index = SPY['date']
SPY_adj = SPY.iloc[:,7:12]
SPY_adj.columns = ['Close','High','Low','Open','Volume']
# 整理資料
import pandas as pd
# 收盤價
Close = SPY_adj.Close
# 日漲跌
Chg = Close - Close.shift(1)
# 上漲幅度
Chg_pos = pd.Series(index=Chg.index, data=Chg[Chg>0])
Chg_pos = Chg_pos.fillna(0)
# 下跌幅度(取正值,所以要加負號)
Chg_neg = pd.Series(index=Chg.index, data=-Chg[Chg<0])
Chg_neg = Chg_neg.fillna(0)
由於RSI是計算過去一段時間的相對強弱,這個"一段時間"是看個人選擇要多長的時間,一般比較常見的是6日、12日、14日、24日,這個沒有一定要哪個日期比較好,這邊我就先用12日來做計算。
# 計算12日平均漲跌幅度
import numpy as np
up_mean_12 = []
down_mean_12 = []
for i in range(13,len(Chg_pos)+1):
up_mean_12.append(np.mean(Chg_pos.values[i-12:i]))
down_mean_12.append(np.mean(Chg_neg.values[i-12:i]))
# 計算 RSI12
rsi_12 = []
for i in range(len(up_mean_12)):
rsi_12.append( 100 * up_mean_12[i] / ( up_mean_12[i] + down_mean_12[i] ) )
rsi_12_series = pd.Series(index = Close.index[12:], data = rsi_12)
rsi_12_series
------
date
2015-09-23 00:00:00+00:00 54.590178
2015-09-24 00:00:00+00:00 40.230350
2015-09-25 00:00:00+00:00 47.161634
2015-09-28 00:00:00+00:00 31.927895
2015-09-29 00:00:00+00:00 29.281669
...
2020-08-26 00:00:00+00:00 77.803522
2020-08-27 00:00:00+00:00 89.678079
2020-08-28 00:00:00+00:00 88.242142
2020-08-31 00:00:00+00:00 84.977578
2020-09-01 00:00:00+00:00 87.310606
Length: 1245, dtype: float64
由於之後寫策略的時候,會需要用到不同時間長度的RSI,因此這邊就來寫一個函數,之後只要將收盤價資料跟天數當作參數帶入RSI函數,就可以快速得到RSI的數值。
# RSI函數
def RSI(Close, period=12):
# 整理資料
import pandas as pd
Chg = Close - Close.shift(1)
Chg_pos = pd.Series(index=Chg.index, data=Chg[Chg>0])
Chg_pos = Chg_pos.fillna(0)
Chg_neg = pd.Series(index=Chg.index, data=-Chg[Chg<0])
Chg_neg = Chg_neg.fillna(0)
# 計算12日平均漲跌幅度
import numpy as np
up_mean = []
down_mean = []
for i in range(period+1, len(Chg_pos)+1):
up_mean.append(np.mean(Chg_pos.values[i-period:i]))
down_mean.append(np.mean(Chg_neg.values[i-period:i]))
# 計算 RSI
rsi = []
for i in range(len(up_mean)):
rsi.append( 100 * up_mean[i] / ( up_mean[i] + down_mean[i] ) )
rsi_series = pd.Series(index = Close.index[period:], data = rsi)
return rsi_series
# 稍微對照一下剛剛算出來的數字,會是一樣的
RSI(Close)
------
date
2015-09-23 00:00:00+00:00 54.590178
2015-09-24 00:00:00+00:00 40.230350
2015-09-25 00:00:00+00:00 47.161634
2015-09-28 00:00:00+00:00 31.927895
2015-09-29 00:00:00+00:00 29.281669
...
2020-08-26 00:00:00+00:00 77.803522
2020-08-27 00:00:00+00:00 89.678079
2020-08-28 00:00:00+00:00 88.242142
2020-08-31 00:00:00+00:00 84.977578
2020-09-01 00:00:00+00:00 87.310606
Length: 1245, dtype: float64
本篇總結
這篇從爬資料、整理資料,到計算出RSI,並撰寫RSI函數方便使用,那接下來就要來使用RSI寫策略做交易囉,請繼續收看下篇文章。
P.S.
如果大家對於量化交易有興趣的話,我自己有上過以下這門課,課程內容從串接股市資料API、儲存至資料庫、將自己的策略轉化成程式碼、自動下單,並且可以把整個流程自動化,每天早上執行一次,一整天就不用看盤了,覺得是蠻實戰的,可以參考看看。
筆者 Sean
奈米戶投資人 / Python愛用者
喜歡用Python玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。