當前位置:
首頁 > 最新 > 使用quantmod包獲取金融數據及投資組合構建

使用quantmod包獲取金融數據及投資組合構建

1.數據獲取

在量化交易中,第一步也是最基礎的一步就是獲得數據,因為只有獲得數據之後我們才能對我們的策略進行回測,進而判斷該策略是否有盈利空間。獲得了數據之後,我們通常使用R、python等語言對數據進行處理。這其中往往會涉及格式整理、數據讀取等步驟。於是我們想,如果可以直接通過R或python獲取數據,就省去了很多麻煩,而R中的quantmod和python中的tushare正好可以實現這一目的,我將分兩篇文章分別介紹一下這兩個常用的工具吧。這篇文章我們將如何使用R獲取金融數據,我們經常使用的是大名鼎鼎的quantmod包。該包功能強大且簡單便捷。下面我們通過一個例子進行講解。

library(quantmod)#Q1 Download data for last 3 years for the DJIA (Dow Jones Industrial Average) getSymbols("DJI", src = "yahoo", from ="2015-05-13", to="2018-05-13")> getSymbols("DJI", src = "yahoo", from ="2015-05-13", to="2018-05-13")[1] "DJI"> DJI DJI.Open DJI.High DJI.Low DJI.Close DJI.Volume DJI.Adjusted2015-05-13 18070.400 18132.801 18039.20 18060.50 62229552 18060.502015-05-14 18062.500 18255.199 18062.50 18252.20 65695046 18252.202015-05-15 18252.000 18272.000 18215.10 18272.60 78350017 18272.602015-05-18 18267.199 18325.500 18244.30 18298.90 56237607 18298.902015-05-19 18300.500 18351.400 18261.30 18312.40 60508579 18312.402015-05-20 18315.100 18350.100 18272.60 18285.40 54638988 18285.402015-05-21 18285.900 18314.900 18249.90 18285.70 52068102 18285.702015-05-22 18286.900 18286.900 18217.10 18232.00 55930692 18232.002015-05-26 18229.801 18229.801 17990.00 18041.50 66750369 18041.502015-05-27 18045.100 18190.301 18045.10 18163.00 58770378 18163.002015-05-28 NA NA NA NA NA NA2015-05-29 18128.100 18128.100 17967.70 18010.70 75170575 18010.702015-06-01 18017.801 18105.801 17982.10 18040.40 62853234 18040.402015-06-02 18033.301 18091.900 17925.30 18011.90 56286736 18011.902015-06-03 18018.400 18168.100 18010.40 18076.30 57921445 18076.302015-06-04 18072.500 18087.199 17876.90 17905.60 70714377 17905.602015-06-05 17905.400 17940.801 17822.90 17849.50 62559864 17849.502015-06-08 17849.500 17852.301 17760.60 17766.60 59895316 17766.602015-06-09 17766.900 17817.801 17715.00 17764.00 59428365 17764.002015-06-10 NA NA NA NA NA NA2015-06-11 18001.301 18109.801 18001.30 18039.40 55254602 18039.402015-06-12 18035.801 18035.801 17857.10 17898.80 55882528 17898.802015-06-15 NA NA NA NA NA NA

通過更換字元串里的symbol ("DJI"), 我們可以獲取不同股票的數據

**但是如果我們有30隻股票,總不能30個股票都打一遍吧。**

這裡我們可以用get()函數,具體描述可以在R裡面輸入 help(get) 查看。

通過這個方法,我們不修改字元(charactor),直接用get()調用

get("DJI")> get("DJI") DJI.Open DJI.High DJI.Low DJI.Close DJI.Volume DJI.Adjusted2015-05-13 18070.400 18132.801 18039.20 18060.50 62229552 18060.502015-05-14 18062.500 18255.199 18062.50 18252.20 65695046 18252.202015-05-15 18252.000 18272.000 18215.10 18272.60 78350017 18272.602015-05-18 18267.199 18325.500 18244.30 18298.90 56237607 18298.902015-05-19 18300.500 18351.400 18261.30 18312.40 60508579 18312.40# download stocksfor(i in seq(stocks)){ getSymbols(stocks[i],src = "yahoo", from ="2015-05-13", to="2018-05-13") print(stocks[i])}> # download stocks> for(i in seq(stocks)){+ getSymbols(stocks[i],src = "yahoo", from ="2015-05-13", to="2018-05-13")+ print(stocks[i])+ }[1] "DWDP"[1] "AXP"[1] "MMM"[1] "IBM"[1] "KO"[1] "MCD"[1] "GS"[1] "MSFT"[1] "TRV"[1] "PG"[1] "UTX"[1] "JPM"[1] "AAPL"[1] "DIS"[1] "BA"[1] "XOM"[1] "INTC"[1] "CAT"[1] "GE"[1] "V"[1] "NKE"[1] "CVX"[1] "CSCO"[1] "PFE"[1] "JNJ"[1] "HD"[1] "UNH"[1] "MRK"[1] "VZ"[1] "WMT"計算DJIA指數的月收益率 及 平均月收益和標準差 DJImonthly = monthlyReturn(get("DJI"), subset=NULL, type="arithmetic", leading=TRUE)mean(DJImonthly)median(DJImonthly)sd(DJImonthly)> mean(DJImonthly)[1] 0.009134663> median(DJImonthly)[1] 0.005004213> sd(DJImonthly)[1] 0.03242341

如果需要算收益率可以用 CalculateReturns()

library(PerformanceAnalytics) getSymbols("AXP", src = "yahoo", from ="2015-05-13", to="2018-05-13")simreturn = CalculateReturns(AXP$AXP.Close, method = "discrete")

畫連續收益圖

chart.CumReturns(simreturn,main="cumulative return")

隨機選取5隻道瓊斯成分股股票,等權分配

#Choose an equal weighted portfolio consisting of any 5 random stocks from the DJIA

portfolio1 = stocks[1:5]

a = monthlyReturn(get(portfolio1[1]), subset=NULL, type="arithmetic",leading=TRUE)

for(i in 2:length(portfolio1)){

a = cbind(a,monthlyReturn(get(portfolio1[i]), subset=NULL, type="arithmetic",leading=TRUE))

}

> portfolio1 = stocks[1:5]

> portfolio1

[1] "DWDP" "AXP" "MMM" "IBM" "KO"

> a = monthlyReturn(get(portfolio1[1]), subset=NULL, type="arithmetic",leading=TRUE)

> for(i in 2:length(portfolio1)){

+ a = cbind(a,monthlyReturn(get(portfolio1[i]), subset=NULL, type="arithmetic",leading=TRUE))

+ }> portfolio_return = a[,1]*1/length(portfolio1)> for(i in 2:length(portfolio1)){+ portfolio_return = portfolio_return + a[,i]*1/length(portfolio1)+ print(i)+ }[1] 2[1] 3[1] 4[1] 5> portfolio_return monthly.returns2015-05-29 0.0024004722015-06-30 -0.0311717522015-07-31 -0.0155647672015-08-31 -0.0504243782015-09-30 -0.0133678532015-10-30 0.0675313662015-11-30 -0.0031107842015-12-31 -0.0169023022016-01-29 -0.1013374902016-02-29 0.058006108

計算平均月收益率和標註差

> mean( portfolio_return)

> sd( portfolio_return)

結語

quantmod不僅可以獲取金融數據,還可以對金融數據進行常見的數據處理甚至進行量化策略編寫等工作,其具體的功能其參照官網文檔:

quantmod.pdf


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 StudyQuant 的精彩文章:

TAG:StudyQuant |