股票
在 R 中記錄多個證券在多個時間段內的每日收益
我的數據集包含 5413 家公司從 2000 年到 2014 年的每日收盤價。我想根據日期計算股票的每日對數回報率(今天的價格/昨天的價格)。我將數據集說明如下:
Date A G L ABA ABB ABBEY 2000-1-3 NA NA NA NA 2000-1-4 79.5 325 NA 961 2000-1-5 79.5 322.5 NA 945 2000-1-6 79.5 327.5 NA 952 2000-1-7 NA 327.5 NA 941 2000-1-10 79.5 327.5 NA 946 2000-1-11 79.5 327.5 NA 888
如何計算每日日誌回報並另外處理 NA。我的樣本期是從2000年到2014年,所以有一些公司是2001年上市的,所以2000年全年都有NA,應該怎麼處理。非常感謝您的幫助。
嗯,這並不容易,因為你沒有提到你的數據是如何格式化的。
data.frame()
我根據您提供的數據創建自己的。如果你的 data.frame 準備好了,你可以跳過這部分。這是我用來創建數據框的程式碼:> #given dates > dates=c("2000-1-3","2000-1-4","2000-1-5","2000-1-6","2000-1-7","2000-1-10","2000-1-11") > #formating from string to dates > newdates=as.Date(dates,"%Y-%m-%d") > #given stock prices > stock1prices=c("NA","79.5","79.5","79.5","NA","79.5", "79.5") > stock2prices=c("NA", "325", "322.5", "327.5", "327.5", "327.5", "327.5") > stock3prices=c("NA","NA","NA","NA","NA","NA","NA") > stock4prices=c("NA","961","945","952","941","946","888") > #NewStockPrces - converting from string to numbers > nsp1=as.numeric(stock1prices) > nsp2=as.numeric(stock2prices) > nsp3=as.numeric(stock3prices) > nsp4=as.numeric(stock4prices) > #creating dataframe of prices > prices=data.frame(newdates,nsp1,nsp2,nsp3,nsp4) > prices newdates nsp1 nsp2 nsp3 nsp4 1 2000-01-03 NA NA NA NA 2 2000-01-04 79.5 325.0 NA 961 3 2000-01-05 79.5 322.5 NA 945 4 2000-01-06 79.5 327.5 NA 952 5 2000-01-07 NA 327.5 NA 941 6 2000-01-10 79.5 327.5 NA 946 7 2000-01-11 79.5 327.5 NA 888
只有 4 隻股票,所以我使用了非常簡單的方法來創建我的數據框價格。這對你來說更重要。
logs=data.frame( + cbind.data.frame( + newdates[-1], + diff(as.matrix(log(prices[,-1]))) + ) + ) > logs newdates..1. nsp1 nsp2 nsp3 nsp4 1 2000-01-04 NA NA NA NA 2 2000-01-05 0 -0.007722046 NA -0.016789481 3 2000-01-06 0 0.015384919 NA 0.007380107 4 2000-01-07 NA 0.000000000 NA -0.011621895 5 2000-01-10 NA 0.000000000 NA 0.005299429 6 2000-01-11 0 0.000000000 NA -0.063270826
為了澄清這段程式碼中發生的事情,讓我們從內到外對其進行分析:
第 1 步:計算日誌返回
- 你知道
log(a/b) = log(a)-log(b)
,所以我們可以計算對數的差異。函式diff(x,lag=1)
計算給定滯後的差異。在這裡,lag=1
它給出了第一個區別。- 我們
x
是數據框中的價格。請從data.frame
沒有我們使用的第一個(有日期)的每一列中選擇prices[,-1]
。- 我們需要對數,所以
log(prices[,-1])
- 函式
diff()
適用於向量或矩陣,因此我們需要將計算出的對數視為矩陣,因此 `as.matrix(log(prices$$ ,-1 $$))- 現在我們可以使用
diff()
withlag=1
,所以diff(as.matrix(log(prices[,-1])))
第 2 步:創建日誌返回和日期的數據框
- 我們不能只使用
cbind()
. 首先,因為長度不同(返回短了 1 條記錄)。我們需要刪除第一次約會,所以newdates[-1]
- 其次,使用 cbind() 將日期轉換為數值,例如 160027 或其他。
在這裡我們必須使用cbind.data.frame(x,y)
,如上所示。- 現在數據已經準備好了,我們可以創建使用 a
data.frame()
並將其命名為日誌,logs=data.frame(...)
如上所示。再一次我不知道你的數據庫是什麼樣子的,所以我不能給你確切的解決方案。最重要的是用來
diff(log(x))
輕鬆計算對數回報。