You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Although much development has been made in the subject, more than half a century later,
200
+
Although much development has been made in the subject, more than half a century later,
188
201
Markowitz's core ideas are still fundamentally important and see daily use in many portfolio management firms.
189
-
The main drawback of mean-variance optimization is that the theoretical
202
+
The main drawback of mean-variance optimization is that the theoretical
190
203
treatment requires knowledge of the expected returns and the future risk-characteristics (covariance) of the assets. Obviously, if we knew the expected returns of a stock life would be much easier, but the whole game is that stock returns are notoriously hard to forecast. As a substitute, we can derive estimates of the expected return and covariance based on historical data – though we do lose the theoretical guarantees provided by Markowitz, the closer our estimates are to the real values, the better our portfolio will be.
191
204
192
205
Thus this project provides four major sets of functionality (though of course they are intimately related)
@@ -258,11 +271,38 @@ The covariance matrix encodes not just the volatility of an asset, but also how
258
271
ef = EfficientFrontier(mu, S, weight_bounds=(-1, 1))
259
272
```
260
273
274
+
```result
275
+
```
276
+
261
277
- Market neutrality: for the `efficient_risk` and `efficient_return` methods, PyPortfolioOpt provides an option to form a market-neutral portfolio (i.e weights sum to zero). This is not possible for the max Sharpe portfolio and the min volatility portfolio because in those cases because they are not invariant with respect to leverage. Market neutrality requires negative weights:
262
278
263
279
```python
264
280
ef = EfficientFrontier(mu, S, weight_bounds=(-1, 1))
ef = EfficientFrontier(mu, S, weight_bounds=(0, 0.1))
272
312
```
273
313
314
+
```result
315
+
```
316
+
274
317
One issue with mean-variance optimization is that it leads to many zero-weights. While these are
275
318
"optimal" in-sample, there is a large body of research showing that this characteristic leads
276
319
mean-variance portfolios to underperform out-of-sample. To that end, I have introduced an
277
320
objective function that can reduce the number of negligible weights for any of the objective functions. Essentially, it adds a penalty (parameterised by `gamma`) on small weights, with a term that looks just like L2 regularisation in machine learning. It may be necessary to try several `gamma` values to achieve the desired number of non-negligible weights. For the test portfolio of 20 securities, `gamma ~ 1` is sufficient
0 commit comments