股票

has.Ad(x) 中的錯誤:找不到對象“BRK”

  • December 13, 2021

我正在嘗試合併眾多公司的調整關閉列表,用於我對風險/回報的 ESG 研究。除了伯克希爾哈撒韋股票 (BRK-A) 之外,這些公司似乎都沒有問題。

程式碼如下:

library(quantmod)
library(PerformanceAnalytics)

maxDate <- "2017-06-23"
minDate <- "2020-12-31" 

average <- c("BABA", "BRK-A", "V", "JNJ", "WMT", "JPM", "MA", "PG", "UNH", "DIS", "BAC", "VZ", "NKE", "NVS", "TM", "MRK", "T", "ABT", "ORCL", "ABBV", "TMO", "XOM", "ACN", "BHP", "CVX")
weights <- c(0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04, 0.04)
getSymbols(average, from=maxDate, to=minDate)

# IMPORTANT: wait 30 seconds to let the source function finish! #
Port.prices <- na.omit(merge(Ad(BABA), Ad(BRK-A), Ad(V), Ad(JNJ), Ad(WMT), Ad(JPM), Ad(MA), Ad(PG), Ad(UNH), Ad(DIS), Ad(BAC), Ad(VZ), Ad(NKE), Ad(NVS), Ad(TM), Ad(MRK), Ad(T), Ad(ABT), Ad(ORCL), Ad(ABBV), Ad(TMO), Ad(XOM), Ad(ACN), Ad(BHP), Ad(CVX)))
Port.returns <- ROC(Port.prices, type="discrete")[-1,]
colnames(Port.returns) <- average 

有沒有人有這個問題的(最好是簡單的)解決方案?當談到 R 時,我仍然是一個菜鳥,所以一些解釋會很棒!

先感謝您!

菲利普

使用 quantmod 包獲取數據時,最好Ad()直接在 上呼叫“調整關閉”函式getSymbols(),否則您可能會遇到麻煩(例如,直接將價格載入到 R 環境中,而不將其保存在變數中) .

使用您自己的程式碼的臨時解決方案:

如上所述,您只能 Ad()直接呼叫getSymbols()伯克希爾哈撒韋股票 ( BRK-A )。這將返回調整後的收盤價,可以將其保存在變數中:

BRK <- Ad(getSymbols("BRK-A", from = maxDate, to = minDate, auto.assign = FALSE))

現在,替換Ad(BRK-A)Port.pricesBRK一切正常。此外,設置auto.assign = FALSE會返回價格而不是將它們載入到 R 環境中(請參閱此處的文件)。


替代解決方法:

我冒昧地提供了另一個工作解決方案(程式碼下方提供的註釋),類似於您自己的程式碼:

library(quantmod)
library(PerformanceAnalytics)
library(xts)

maxDate <- "2017-06-23"
minDate <- "2020-12-31" 

tickers <- c("BABA", "BRK-A", "V", "JNJ", "WMT", "JPM", "MA", "PG", "UNH", "DIS", "BAC", "VZ", "NKE", "NVS", "TM", "MRK", "T", "ABT", "ORCL", "ABBV", "TMO", "XOM", "ACN", "BHP", "CVX")

n <- length(tickers)

prices <- xts()
weights <- rep(1/n, n)

for (i in 1:length(tickers)){

 getdata <- try(Ad(getSymbols(tickers[i], 
   from = maxDate, to = minDate, auto.assign = FALSE, silent = T)))

 prices <- cbind(prices, getdata)

 print(sprintf("%s", i))
}

# IMPORTANT: wait 30 seconds to let the source function finish! #
Port.returns <- ROC(prices, type="discrete")[-1,]

對我的程式碼提供一些註釋,以減輕混淆:

  1. 您的等權向量 ,weights可以通過除以資產數量 n 來概括,然後重複此數量n次。
  2. xts是一個多變數時間序列庫,是一個很好的工具,可以將所有調整後的收盤價收集到一個矩陣中。
  3. **for 循環可以解釋如下:**對於 中的每個股票tickers,我們得到調整後的收盤價,並將它們保存在一個名為 的變數中getdatagetdata然後,我們將變數與價格時間序列矩陣進行列綁定。因此,我們不需要Ad()事後打電話。起初,prices它只是一個空矩陣(時間序列對象),因此呼叫cbind(prices, getdata)將為您提供“BABA”的第一個調整後收盤價。現在,第二次迭代將列綁定價格(包含“BABA”調整的收盤價)和 getdata(包含“BRK-A”的調整收盤價),這將有效地更新prices變數,現在包含“BABA”和“BRK-A” " 在列上(並且每天在行上關閉)。這將發生直到 for 循環結束,給你一個矩陣prices包含由其股票程式碼定義的所有資產的收盤價tickers

替代解決方案為您節省了手動建構定價矩陣的幾分鐘時間Port.prices,並且可以擴展為任何數量的程式碼(只要程式碼正確)。我希望這有幫助!

引用自:https://quant.stackexchange.com/questions/63317