在《R的極客理想》中看到一個MACD的簡單策略。以爲還行,記下來之後優化用。我添加了一些註釋幫助你們理解證券交易和R語言代碼。segmentfault
一次都裝上,備用windows
> pkgs <- c("quantmod","zoo","xts","TTR","PerformanceAnalytics","ggplot2") > install.packages(pkgs) There is a binary version available but the source version is later: binary source needs_compilation zoo 1.8-6 1.8-7 TRUE Binaries will be installed …… trying URL 'https://mirrors.tongji.edu.cn/CRAN/bin/windows/contrib/3.6/ggplot2_3.2.1.zip' Content type 'application/zip' length 3974945 bytes (3.8 MB) downloaded 3.8 MB package ‘quantmod’ successfully unpacked and MD5 sums checked package ‘zoo’ successfully unpacked and MD5 sums checked package ‘xts’ successfully unpacked and MD5 sums checked package ‘TTR’ successfully unpacked and MD5 sums checked package ‘PerformanceAnalytics’ successfully unpacked and MD5 sums checked package ‘ggplot2’ successfully unpacked and MD5 sums checked The downloaded binary packages are in C:\Users\chang\AppData\Local\Temp\RtmpygTUIm\downloaded_packages >
載入quantmod包,數據源是Yahoo,固然外國網站,你懂的,有時候不是能用的。下載全球五大指數數據。session
指數名稱 | 英文簡稱 |
---|---|
標普500 | GSPC |
日經225 | N225 |
恆生指數 | HSI |
富時新加坡指STI數 | STI |
上證指數 | SSE |
> library(quantmod) 載入須要的程輯包:xts 載入須要的程輯包:zoo 載入程輯包:‘zoo’ The following objects are masked from ‘package:base’: as.Date, as.Date.numeric Registered S3 method overwritten by 'xts': method from as.zoo.xts zoo 載入須要的程輯包:TTR Registered S3 method overwritten by 'quantmod': method from as.zoo.data.frame zoo Version 0.4-0 included new data defaults. See ?getSymbols. > options(stringsAsFactors = FALSE) > # 指定股票代碼,從yahoo下載 > # 開始日期,自動判斷最近交易日,不用本身費心 > symbols <- c("^GSPC","^N225","^HSI","^STI","000001.SS") > suppressWarnings(getSymbols(symbols,src = "yahoo",from="2012-01-01")) > ‘getSymbols’ currently uses auto.assign=TRUE by default, but will use auto.assign=FALSE in 0.5-0. You will still be able to use ‘loadSymbols’ to automatically load data. getOption("getSymbols.env") and getOption("getSymbols.auto.assign") will still be checked for alternate defaults. This message is shown once per session and may be disabled by setting options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details. [1] "^GSPC" "^N225" "^HSI" "^STI" "000001.SS" > head(`000001.SS`) 000001.SS.Open 000001.SS.High 000001.SS.Low 000001.SS.Close 000001.SS.Volume 000001.SS.Adjusted 2012-01-04 2211.995 2217.520 2168.644 2169.390 49200 2169.390 2012-01-05 2160.897 2183.404 2145.556 2148.452 58800 2148.452 2012-01-06 2148.147 2164.322 2132.626 2163.395 50600 2163.395 2012-01-09 2164.741 2226.218 2148.453 2225.890 76800 2225.890 2012-01-10 2221.832 2288.628 2218.275 2285.744 109600 2285.744 2012-01-11 2282.913 2290.644 2265.185 2276.046 84400 2276.046
> # 準備用收益率替代指數價格,方便對比比較 > df <- merge(GSPC$GSPC.Adjusted,N225$N225.Adjusted,HSI$HSI.Adjusted,STI$STI.Adjusted,`000001.SS`$`000001.SS.Adjusted`) > names(df) <- c("GSPC","N225","HSI","STI","SSE") > head(df) GSPC N225 HSI STI SSE 2012-01-03 1277.06 NA 18877.41 2688.36 NA 2012-01-04 1277.30 8560.11 18727.31 2711.02 2169.390 2012-01-05 1281.06 8488.71 18813.41 2713.02 2148.452 2012-01-06 1277.81 8390.35 18593.06 2715.59 2163.395 2012-01-09 1280.70 NA 18865.72 2691.28 2225.890 2012-01-10 1292.08 8422.26 19004.28 2719.83 2285.744 > g <- ggplot(aes(x = Index,y = Value,color = Series),data = fortify(df,melt = TRUE)) + geom_line(size = 1) + scale_y_continuous(breaks = seq(1000,30000,4000)) + ggtitle("Gloabel Index") > g
很明顯,直接的價格沒法比較,因此咱們都轉化爲收益率。順便算一下年收益率。app
> library(PerformanceAnalytics) 載入程輯包:‘PerformanceAnalytics’ The following object is masked from ‘package:graphics’: legend > ret_df <- Return.calculate(df,method="discrete") > chart.CumReturns(ret_df,legend.loc = "topleft",main="Cumulative Daily Returns for Gloable Index") > Return.annualized(ret_df) GSPC N225 HSI STI SSE Annualized Return 0.1157303 0.1510661 0.05739009 0.03016343 0.0374123 >
指數 | 年收益率 |
---|---|
GSPC | 0.1157303 |
N225 | 0.1510661 |
HSI | 0.05739009 |
STI | 0.03016343 |
SSE | 0.0374123 |
這個策略很簡單,就是一根30日簡單均線的趨勢跟蹤策略。函數
># MACD模型 >MACD <- function(dt,n=30){ + names(dt) <- c('close') + #均線 + dat <- na.locf(dt) #na.locf刪掉數據裏面的全部NA + dat$ma <- SMA(dat$close,n) + #買賣信號 + sig_buy <- which(dat$ma-dat$close>0) + sig_sell <- which(dat$ma-dat$close<0) + sig_buy <- sig_buy[which(diff(sig_buy)>1)] + sig_sell <- sig_sell[which(diff(sig_sell)>1)] + if(first(sig_sell)<first(sig_buy)) sig_sell <- sig_sell[-1] + if(last(sig_sell)<last(sig_buy)) sig_buy <- sig_buy[-length(sig_buy)] + trade_dat <- do.call(rbind.data.frame,apply(cbind(sig_buy,sig_sell), 1, function(row){ + dt[row[1]:row[2],] + })) + ret_trade <- Return.calculate(trade_dat,method="discrete") + return(ret_trade) + } > #用MACD計算一遍歷史數據,計算每日收益 > macd_ret <- lapply(df,function(col) MACD(col,30)) > #算年收益率 > t(do.call(rbind.data.frame,lapply(macd_ret, Return.annualized))) GSPC N225 HSI STI SSE close 0.2082891 0.1823697 0.1879596 0.03251933 0.1429962 >
指數 | 指數年收益率 | MACD策略年收益率 |
---|---|---|
GSPC | 0.1157303 | 0.2082891 |
N225 | 0.1510661 | 0.1823697 |
HSI | 0.05739009 | 0.1879596 |
STI | 0.03016343 | 0.03251933 |
SSE | 0.0374123 | 0.1429962 |
改善明顯啊 。優化
從2012年到2020年,竟然美股達到了年化20%的收益率。巴菲特啊。日本和香港也能18%。A股票也很爭氣,14%至關漂亮啊。網站
感謝閱讀,歡迎關注和留言> 感謝閱讀,歡迎關注和留言 量化投資與期貨外匯散仙,基金保險水平也拿的出手