網頁

2020年12月29日 星期二

R:各國指數比較

     2020因為新冠疫情的關各國經濟受到不小衝擊,連帶股價也跳水,不過自3月疫情爆發以來到現在12月底幾個重要的指數到底恢復的如何,這篇就用R來統計一下。
    我舉美國道瓊(代碼:DJI),台灣加權(代碼:TWII),新加坡海峽(代碼:STI),越南指數(代碼:VNI),香港恆生(代碼:HSI)來當例子說明。
程式碼如下:

#載入所需套件
library(quantmod)
library(PerformanceAnalytics)

#開始統計的起始日期
d_from <- "2020-01-01"
#自Yahoo資料庫抓取資料
index_symbol <- c("^DJI", "^TWII", "^STI", "^HSI")
getSymbols(index_symbol, src="yahoo", from=d_from)

#將每日收盤調整價放入變數
TW_DR <- dailyReturn(Ad(TWII))
DJ_DR <- dailyReturn(Ad(DJI))
ST_DR <- dailyReturn(Ad(STI))
HS_DR <- dailyReturn(Ad(HSI))

#將各指數的股價資料合併,缺少資料的不列出
m1 <- merge(DJ_DR, TW_DR, ST_DR, HS_DR, all = F)
#設定欄位名稱
colnames(m1) <- c("Dow Jones", "Taiwan", "Singaport", "HangSeng")
#畫出圖表
charts.PerformanceSummary(m1, event.labels = T, main = "Performance Summary")

如下圖:


 顏色依序是:黑色線條是道瓊指數,紅色線條是台灣加權指數,綠色線條是新加坡海峽指數,藍色線條是香港恆生指數。

#計算標準差夏普值
table.AnnualizedReturns(m1, scale = 252, Rf = 0.01/252)
 

可以看出新加坡海峽指數是最差,台灣加權指數表現最好。

#計算年報酬率
DJ <- annualReturn(DJI)
TW <- annualReturn(TWII)
ST <- annualReturn(STI)
HS <- annualReturn(HSI)

df <- data.frame(DJ, TW, ST, HS)
colnames(df) <- c("DJI%", "TWI%", "STI%", "HSI%"); df*100


自2020/01/01開始到12/28日止,各大指數回報率最好是台灣加權20.4%,新加坡海峽指數最差-12.0%。


2020年12月10日 星期四

R:KDJ 指標的計算


 KDJ指標中文名隨機指標,由喬治·萊恩(GeorgeLane)創立,是目前期貨和股票市場上常用的技術分析指標。KDJ指標在設計過程中主要是研究最高價、最低價和收盤價之間的關系,體現市場情緒,可以用來測度超買或超賣現象,被廣泛應用於中短期趨勢分析中。

     一般說來,KD線超過80意味著超買,KD線低於20意味著超賣;K線在低位上穿D線為“金叉”是買入信號,K線在高位下穿D線為“死叉”是賣出信號。由此可見KDJ是非常簡單實用的技術指標。但是在R語言常用的幾個量化套件(如quantmod、PerformanceAnalytics 和 TTR)中都沒有用於計算KDJ指標的函數。這篇就根據 KDJ 的定義總結 KDJ 的計算方法。

  計算 KDJ 首先要計算周期的 RSV值,就是未成熟隨機指標值,然後再依次計算K值、D值及J值。以 KDJ 日線數據的計算為例,其計算公式為:(圖片摘自理財周刊)

J值 = (3 * 當日K值) - (2 * 當日D值)

那我就以特斯拉(美股代號:TSLA)來說明,
首先我們先抓取2020/03/01 到 2020/12/09 TESLA的股價資訊
library(quantmod)
library(PerformanceAnalytics)
d_from <- "2020-03-01"
symbo <- c("TSLA")
s <- symbo
col <- c("white", "black")
getSymbols(s, src="yahoo", from=d_from, col=col[2])
stock <- get(s)
 

接著根據股價資訊來計算 KDJ 值
stock_length <- nrow(stock)        # 數據長度
KDJ <- matrix(NA, stock_length, 3) # 構建存放數據的矩陣
KDJ <- as.data.frame(KDJ)          # 轉換為data.frame
colnames(KDJ) <- c("K", "D", "J")  # 1-3列的名稱為K,D,J
KDJ[1:8, ] <- 50                   # 前8天的K,D,J均設為50
high_max <- runMax(Hi(stock), n=9) # 計算9日內最高價
low_min <- runMin(Lo(stock), n=9)  # 計算9日內最低價
rsv <- (Cl(stock) - low_min)/(high_max - low_min) * 100 #計算rvs
for(i in 9:stock_length) {
  KDJ[i, 1] <- 2/3 * KDJ[(i-1), 1] + 1/3 * rsv[i, ]  #計算K值
  KDJ[i, 2] <- 2/3 * KDJ[(i-1), 2] + 1/3 * KDJ[i, 1]
#計算D值
  KDJ[i, 3] <- 3 * KDJ[i, 1] - 2 * KDJ[i, 2]         #計算J值
}

KDJ <- as.xts(KDJ, order.by=index(rsv)) #將KDJ轉化為xts格式
cols <- c("red","blue","darkcyan")      #KDJ線顏色分別為紅
、藍、暗青色
chartSeries(stock, theme=col[1], name=s, TA="addTA(KDJ, col=cols)")

執行結果如下:

和看盤軟體比對一下,結果正確:

也可以輸入 tail(KDJ, n=10)來看最後10天的KDJ值:


難怪小摩昨天說 Tesla只值90美元,股價馬上就修正了7%。

使用圖表、圖形和把數據進行可視化,可以幫你更容易的解釋數據模式、趨勢、統計規律和數據的相關性。至於投資還是要注意風險,就如廣告所說:「投資一定有風險,基金投資有賺有賠,申購前應詳閱公開說明書」