股票

在 R 中記錄多個證券在多個時間段內的每日收益

  • January 23, 2016

我的數據集包含 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()with lag=1,所以diff(as.matrix(log(prices[,-1])))

第 2 步:創建日誌返回和日期的數據框

  • 我們不能只使用cbind(). 首先,因為長度不同(返回短了 1 條記錄)。我們需要刪除第一次約會,所以newdates[-1]
  • 其次,使用 cbind() 將日期轉換為數值,例如 160027 或其他。
    在這裡我們必須使用cbind.data.frame(x,y),如上所示。
  • 現在數據已經準備好了,我們可以創建使用 adata.frame()並將其命名為日誌,logs=data.frame(...)如上所示。

再一次我不知道你的數據庫是什麼樣子的,所以我不能給你確切的解決方案。最重要的是用來diff(log(x))輕鬆計算對數回報。

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