(returns: &DMatrix<f64>)
| 32 | } |
| 33 | |
| 34 | fn covariance(returns: &DMatrix<f64>) -> DMatrix<f64> { |
| 35 | let rows = returns.nrows(); |
| 36 | let cols = returns.ncols(); |
| 37 | let means: Vec<f64> = (0..cols).map(|c| returns.column(c).sum() / rows as f64).collect(); |
| 38 | let mut cov = DMatrix::zeros(cols, cols); |
| 39 | for i in 0..cols { |
| 40 | for j in i..cols { |
| 41 | let mut s = 0.0; |
| 42 | for r in 0..rows { |
| 43 | s += (returns[(r, i)] - means[i]) * (returns[(r, j)] - means[j]); |
| 44 | } |
| 45 | s /= (rows - 1) as f64; |
| 46 | cov[(i, j)] = s; |
| 47 | cov[(j, i)] = s; |
| 48 | } |
| 49 | } |
| 50 | cov |
| 51 | } |
| 52 | |
| 53 | fn assert_basic_weights(weights: &[f64], n_assets: usize) { |
| 54 | assert_eq!(weights.len(), n_assets); |
no outgoing calls
no test coverage detected