我是R和投资组合优化的新手。我尝试生成一个协方差表的逆矩阵。 我有10只股票,回报率超过5天。 (我减少了示例的实际大小) 这是退货表:
ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8 ID9 ID10
3/29/2017 0.0654 -0.0027 0.0025 0.0168 0.4676 0.8515 -0.1152 -0.0298 0 -0.3897
3/30/2017 -0.0326 0 -0.0076 0 -0.5556 0.4907 0.0142 -0.0097 0 0.1392
3/31/2017 0 -0.0054 0.0152 -0.0335 0.2336 0.5856 -0.0577 0 -0.0054 -0.219
4/3/2017 0.0643 0.0027 0.0152 0 0.6429 1.0852 0.0289 0.0287 0 0.267
4/4/2017 0.0318 0 0.005 0.0169 -0.1906 -0.0313 -0.145 -0.0096 0.0027 -1.1001
然后我应用协方差函数:
CovTable <- cov(Returns)
哪个产生此表:
ID1 ID2 ID3 ID4 ID5 ID6 ID7 ID8 ID9 ID10
ID1 0.001791 0.000034 0.000192 0.000408 0.017139 0.007902 -0.000916 0.000108 0.000039 -0.003565
ID2 0.000034 0.000009 -0.000004 0.000034 -0.000036 0.000172 0.000101 0.000034 0.000007 0.000387
ID3 0.000192 -0.000004 0.000092 -0.000096 0.003535 0.001392 0.000027 0.000128 -0.000013 0.000273
ID4 0.000408 0.000034 -0.000096 0.000423 -0.000804 -0.001490 -0.000610 -0.000166 0.000057 -0.004438
ID5 0.017139 -0.000036 0.003535 -0.000804 0.240015 0.152353 0.000960 0.003544 -0.000363 0.056594
ID6 0.007902 0.000172 0.001392 -0.001490 0.152353 0.177324 0.018715 0.003369 -0.000409 0.177301
ID7 -0.000916 0.000101 0.000027 -0.000610 0.000960 0.018715 0.005890 0.001099 -0.000057 0.038787
ID8 0.000108 0.000034 0.000128 -0.000166 0.003544 0.003369 0.001099 0.000454 -0.000009 0.005793
ID9 0.000039 0.000007 -0.000013 0.000057 -0.000363 -0.000409 -0.000057 -0.000009 0.000009 -0.000623
ID10 -0.003565 0.000387 0.000273 -0.004438 0.056594 0.177301 0.038787 0.005793 -0.000623 0.290340
现在,如果我尝试与
相反 minverse <- solve(CovTable)
我收到此错误:
Error in solve.default(covTable) :
system is computationally singular: reciprocal condition number = 1.67973e-21
现在,如果我只使用5只或更少的股票,或任何数量小于或等于我在退货表中的天数的股票,那就完美无缺。
所以我的问题是如何得到一个共同方差表的逆矩阵,其股票数量多于返回表格中观察到的天数?
以下是生成错误的完整代码:
library(RODBC)
ch <- odbcDriverConnect('driver={SQL Server};server=MyServername\\SQLEXPRESS;database=MyDatabase;trusted_connection=true')
Returns <- sqlFetch(ch, "Returns") # Import Returns Table from SQL to R
Returns <-cast(Returns, Date ~ Id) # Organize Returns Table in Pivot Table
rownames(Returns) <- Returns[,1] # Use the Date Column as Row Headers
Returns <- Returns[,-1] # Remove the Date Column
CovTable <- cov(Returns) # Create Covariance Matrix
minverse <- solve(CovTable) # Solve CovTable