iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 5
0
AI & Data

量化交易30天系列 第 5

量化交易30天 Day5 - Python計算RSI

量化交易30天
本系列文章是紀錄一位量化交易新手的學習過程,除了基礎的Python語法不說明,其他金融相關的東西都會一步步地說明,希望讓更多想學習量化交易但是沒有學過相關金融知識的朋友們,透過這系列的文章,能夠對量化交易略知一二,也歡迎量化交易的高手們多多交流。

RSI相對強弱指標是什麼

RSI是Relative Strength Index的縮寫,1978年由Wells Wilder發明,是用來衡量過去一段時間內,投資標的漲跌趨勢的相對指標,Relative這個字代表的是,它是以過去這段時間內的上漲量對比下跌量,或者我們也可以說是買盤與賣盤的相對強弱,因此是一個相對的概念。

RSI的計算公式

RSI = 100 × 前N日漲幅的平均值 ÷ ( 前N日漲幅的平均值 + 前N日跌幅的平均值 )

從上面這個公式可以觀察到,由於我們是計算漲或是跌的"幅度",因此都是取絕對值,數字都是大於0的,所以RSI這個數字一定會介在0~100中間。

設想幾個情況喔:

  • 前N日漲幅的平均值 = 前N日跌幅的平均值:把這個條件帶入公式,RSI會等於50,代表這段時間內買盤跟賣盤是差不多的。
  • 前N日漲幅的平均值 < 前N日跌幅的平均值:RSI小於50,代表買盤較賣盤弱。
  • 前N日漲幅的平均值 > 前N日跌幅的平均值:RSI大於50,代表買盤較賣盤強。

相信到了這邊,我們對RSI的理解就有初步的認識。

Python計算RSI

下面會教大家怎麼從收盤價的時間序列資料,計算出對應的RSI值:

  1. 先整理資料

# 串接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)
  1. 計算RSI值

由於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
  1. 將計算RSI值的過程寫成一個函數

由於之後寫策略的時候,會需要用到不同時間長度的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玩轉金融數據,從個股基本面、技術面、籌碼面相關資料,一直到總體經濟數據,都是平常接觸到的素材;對於投資,除了研究歷史數據,也喜歡瞭解市場上大家在玩些什麼。


上一篇
量化交易30天 Day4 - 運用K線型態來交易
下一篇
量化交易30天 Day6 - 用RSI指標來做交易
系列文
量化交易30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言