2017-05-05 77 views
1

我想使用使用R:金融股

library(pdfetch) 
tickers <- c('FB','YHOO'.....etc long list of tickers) 
pdfetch_YAHOO(tickers, fields = c("adjclose"), 
    from = as.Date("2017-04-01"), 
    to = as.Date("2017-04-30")) 

我的代碼是不是雖然工作。如果有人能告訴我如何將這些信息輸出到圖表,我會非常感謝!

+0

,我不斷收到錯誤如下:錯誤的FR [,比賽(場,valid.fields)+ 1]: 尺寸 – MasterOfHack

+0

的數量不正確什麼樣的錯誤你得到些什麼?我在使用'pdfetch()'查詢時沒有任何問題。我只使用了2個符號,而不是7000.因此,您需要將7000個列表拆分爲更小的數據幀,然後將它們放在一起。 –

+0

有沒有辦法有效地削減這些數據,然後將它們拼接在一起,而不是複製並粘貼到Excel中?如果我將我的數據分成50幀,那麼這種方法將花費很長時間....提前感謝您的幫助! – MasterOfHack

回答

0

好的,我不確定這次練習的目標是什麼,但我會採取一些措施。我將會使用quantmod庫,因爲我知道它。我在這裏做的是建立一個tickers列表,獲取這些tickers,創建一個傳遞數據的函數,將這些數據轉換爲關閉值的xts對象,並將其插入到dygraph中,該dygraph會自動解釋xts數據。

library(dygraphs) 
library(quantmod) 
library(data.table) 
library(magrittr) 

tickers <- c('FB','YHOO') 

temp <- getSymbols(tickers, 
      from = as.Date("2001-04-01"), 
      to = as.Date("2017-04-30")) 

munge_data <- function(tickers){ 

    data <- lapply(tickers, get) %>% 
    lapply(as.data.table) %>% 
    lapply(function(df) setnames(df, colnames(df), 
           c("Date","Open","High", 
            "Low","Close","Volume", 
            "Adjusted"))) 
    names(data) <- tickers 

    rbindlist(data,idcol = T) 

} 

my_data <- tickers %>% 
    munge_data %>% 
    .[,.(Date,.id,Close)] %>% 
    dcast(...~.id, value.var = "Close") %>% 
    as.xts.data.table() 

dygraph(my_data) 

這將採取任意數量的tickers並繪製它們(雖然區分7000個ticker符號在圖上是不可能的)。

0

下面是一個使用ggplot2繪圖的方法。我們將數據下載到每個元素都是股票代碼的列表中。我們將其轉換爲數據框。在調用ggplot的過程中,我們將數據從寬格式轉換爲長格式並對數據進行縮放,以便所有關閉值都相對於期間第一天的關閉值。這使得在同等規模的每一隻股票:

library(pdfetch) 
library(tidyverse) 
library(xts) 

tickers = c('FB','YHOO','GENE','AAPL','MSFT','LUV','AMZN','AIV','BUD','HPQ','XOM','UAL') 

# Download tickers into a list 
df = map(tickers, function(tt) { 
    pdfetch_YAHOO(tt, fields = c("adjclose"), 
       from = as.Date("2017-04-01"), 
       to = as.Date("2017-04-30")) 
}) 

# Convert to a data frame 
df = do.call(cbind, df) 
df = data.frame(date=as.Date(index(df)), df) 

# Convert data frame to long format and plot 
ggplot(gather(df, ticker, close, -date) %>% 
     group_by(ticker) %>% 
     mutate(close=close/close[1]), 
     aes(date, close)) + 
    geom_hline(yintercept=1, colour="grey30", size=0.2) + 
    geom_line(size=0.4) + 
    facet_grid(~ ticker) + 
    theme_classic(base_size=9) + 
    theme(strip.background=element_blank(), 
     axis.text.x=element_blank()) + 
    scale_y_continuous(limits=c(0.94, 1.06), breaks=seq(0,2,0.05)) + 
    labs(x="April") + 
    guides(colour=FALSE) 

enter image description here

你也可以用顏色來顯示當一隻股票低於/高於它的價值在一個月的開始。爲此,我們使用插值法,以便線條越過1時顏色始終發生變化。我們還會使用更小的主題。

# Dates to interpolate at 
dts = seq(min(df$date), max(df$date), length=500) 

# Create an interpolated data frame (note this data frame will have 7000*500 rows if 
# you do this for 7000 symbols (not that you'd want to plot that many stocks 
# at once anyway) 
df.interp = gather(df, ticker, close, -date) %>% 
    split(. , .$ticker) %>% 
    map_df(~ data.frame(approx(.x$date, .x$close, xout=dts), ticker=.x$ticker[1])) %>% 
    rename(date=x, close=y) 

ggplot(df.interp %>% 
     group_by(ticker) %>% 
     mutate(close=close/close[1]), 
     aes(date, close, colour=close > 1, group=ticker)) + 
    geom_hline(yintercept=1, colour="grey30", size=0.2) + 
    geom_line(size=0.6) + 
    facet_grid(~ ticker) + 
    theme_classic(base_size=9) + 
    theme(strip.background=element_blank(), 
     axis.text.x=element_blank(), 
     axis.line.x=element_blank(), 
     axis.ticks.x=element_blank()) + 
    scale_y_continuous(limits=c(0.94, 1.06), breaks=seq(0,2,0.05)) + 
    labs(x="April 2017") + 
    guides(colour=FALSE) 

enter image description here

+0

非常感謝您花時間爲我提供這樣一個深入的答案,這真是太棒了!由於某種原因,每當我嘗試下載代碼到一個列表中,我會得到以下錯誤:「fr [,match(fields,valid.fields)+ 1]中的錯誤: 維數不正確」任何想法可能會發生什麼在這?再次感謝!!! – MasterOfHack

+0

呃 - 我一直玩這個代碼的時間長達兩個小時 - 出於某種原因 - 任何時候我在我的列表中放了超過10個代碼的時候,它會說「錯誤fr [,match(fields,valid.fields)+ 1 ]: 維數不正確「.....不知道爲什麼會發生這種情況。如果您有任何建議,我會很感激它,謝謝你的幫助! – MasterOfHack

+0

我不確定是什麼導致下載問題。這是我第一次使用'pdfetch'。你用'quantmod'試過了嗎? – eipi10