我們這次來計算看看RSI,一開始我們一樣載入資料庫並清理表單
#載入套件庫與讀入資料 import pandas as pd import matplotlib.pyplot as plt import sqlite3
db = sqlite3.connect(‘TWStock_2’) tsmc = pd.read_sql(con=db,sql=‘SELECT * FROM “2330”’)
#清理資料 #我們需要成交股數、開盤價、最高價、最低價、收盤價的資料 #並使用Date當作我們的索引值
tsmc.index = pd.to_datetime(tsmc[‘Date’]) tsmc = tsmc[[‘成交股數’,‘開盤價’,‘最高價’,‘最低價’,‘收盤價’]] tsmc.columns = [‘Volume’,‘Open’,‘High’,‘Low’,‘Close’] tsmc[‘Close’] = pd.to_numeric(tsmc[‘Close’]) tsmc = tsmc[‘2019-01-01’:]
RSI
根據維基百科: 相對強弱指數(Relative Strength Index,RSI),一藉比較價格升降運動以表達價格強度的技術分析工具。 其計算方法為 設每天向上變動為U,向下變動為D。
-
在價格上升的日子: U = 當日收盤價 – 昨日收盤價, D =0
-
在價格下跌的日子: U = 0 , D = 昨日收盤價 – 當日收盤價
有了U和D的值之後,我們需要計算U以及D的平均值,這邊的平均值是使用n天的指數移動平均(EMA),則我們可以計算出相對強度

有了相對強度,我們就可以計算出RSI

根據威爾德(英語:J. Welles Wilder)的測量結果,當n=14時,指數最具代表性。他指出當某證券的RSI升至70時,代表該證券已被超買(Overbought),投資者應考慮出售該證券。相反,當證券RSI跌至30時,代表證券被超賣(Oversold),投資者應購入該證券。
所以我們第一步先計算差價,讓然根據計算U跟D的規則算出U和D,在利用上一集計算指數移動平均的算法算出平均,這樣我們就能求出相對強度RS,進而求出RSI
def cal_U(num): if num >= 0: return num else: return 0 def cal_D(num): num = -num return cal_U(num)
tsmc[‘U’] = tsmc[‘Dif’].apply(cal_U) tsmc[‘D’] = tsmc[‘Dif’].apply(cal_D) tsmc[‘ema_U’] = tsmc[‘U’].ewm(span=14).mean() tsmc[‘ema_D’] = tsmc[‘D’].ewm(span=14).mean() tsmc[‘RS’] = tsmc[‘ema_U’].div(tsmc[‘ema_D’]) tsmc[‘RSI’] = tsmc[‘RS’].apply(lambda rs:rs/(1+rs) * 100)
最後我們在畫個圖,把RSI,70,30的值畫上
#最後來畫畫圖 #來畫個圖吧 plt.figure(figsize=(10,10)) tsmc[‘RSI’].plot() plt.plot(tsmc.index,[70]*len(tsmc.index)) plt.plot(tsmc.index,[30]*len(tsmc.index)) plt.legend() plt.show()
