設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 876|回復: 0
打印 上一主題 下一主題

用 R 理財, 下載歷史股價合併至財務報表

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2018-2-22 13:43:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
如何用 R 一次下載所有台股的歷史股價?
以下為 quantmod 下載股價的基本指令:

  1. > library(quantmod) # 開啟套件
  2. > getSymbols("YHOO", from = "2016-04-01", to = "2016-04-29", src="google")   # 用 getSymbols() 輸入"股票代碼""日期""資料庫來源"
複製代碼

要用 quantmod 下載股價首先必須要知道台股的代碼,若沒指定資料庫 quantmod 內建的設定是 yahoo finance,因此台股的代碼必須符合 yahoo finance 的格式,像台股代碼 3266 在 yahoo finance 是 3266.TW。先用從公開資訊觀測站下載的財報資料,代碼欄位進行字串編輯,再另外指定代碼欄位的變數,放入 getSymbols():
  1. > library(quantmod)
  2. > m_data_20160411 <- read.table("Desktop/R/m_data_20160411.csv", header=TRUE, sep=",") #匯入 CSV 財報檔
  3. > name <- paste(m_data_20160411[,1],"TW", sep = ".") #依據財報檔的代碼欄位新增 .TW 於字串中,並指定為變數 "name"
  4. > getSymbols(name, from = "2016-04-27", to = "2016-04-27", src="yahoo")
複製代碼


這個方式初步成功了,也產生了每支股票在指定日期內的所有資料,開盤價 Op、收盤價 Cl、最高價 Hi、最低價 Lo、成交量 Vo、均價 Ad 六個欄位的 data frame。
1101.TW於2016-04-27這天的成交資料
然而這個方法有一個很大的問題,就是如果 yahoo finance 或其他資料庫某幾支股票有一些問題無法下載時便會停止,查找後發現有 4 支股票的資料無法下載。為了這個問題在網路上找了很久,試過各種方式後來選擇用 loop 的方式解決 :
> dataset<- xts() #設置一個xts資料框架
以下為 loop 的寫法:
  1. for(i in 1:length(name)) {
  2.   name[i]-> symbol
  3.   tryit <- try(getSymbols(symbol,from="2016-04-27", src='yahoo'))# specify the "from" date to desired start date
  4.   if(inherits(tryit, "try-error")){
  5.     i <- i+1
  6.   } else {
  7.     data <- getSymbols(symbol, from="2016-04-27", src='yahoo')# specify the "from" date to desired start date
  8.   dataset <- merge(dataset, Cl(get(name[i])))#將所有股票的收盤價 Cl 合併成一個 data frame
  9.   rm(symbol)
  10.   }
  11. }
複製代碼
從指令可以看出是要電腦依據股票代碼,一個個到資料庫抓取資料,try() 的用法,然後用 if else 設條件,如果資料抓取失敗就跳到下一個股票,最後將所有股票的收盤價 Cl 合併成一個 data frame。
跑出一個很長的 data frame 總共找出 824 支股票(行)在 2016-04-27(列)的收盤價,
由此只要在設定期間內,每日的股價都可以下載
最後將股價資料合併至一開始匯入的財報檔:
  1. > myDF <- as.data.frame(as.matrix(dataset))#將dataset轉換為data frame
  2. > namex2 <- substr(name, start = 1, stop = 4)#先將股票代碼統一成m_data_20160411"公司代號"格式
  3. > newrow = namex2
  4. > datasetSS = rbind(myDF,newrow)#將股票代碼新增1列至myDF中
  5. > datasetT <- t(datasetSS)#轉置datasetSS
  6. > colnames(datasetT)[colnames(datasetT)=="2"] <- "公司代號" #更改datasetT股票代碼的欄位名稱
  7. > m_data <- merge.data.frame(m_data_20160411,datasetT,by="公司代號",all=TRUE) #依照"公司代號"合併資料
  8. > colnames(m_data)[colnames(m_data)=="2016-04-27 08:00:00"] <- "price.close" #更改欄位名稱為"price.close"
  9. > write.table(m_data, file = "Desktop/R/m_data.csv", sep = ",")#將結果匯出成csv檔
複製代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-5-16 18:39 , Processed in 0.271436 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表