Implements peer-review requests

1. `HistoricalReturnsAlphaModel`:
   1. Adds lookback period for return calculation
   2. Adds return-depend direction to insights
   3. Refactors indicator history warm-up
2. `MeanVarianceOptimizationPortfolioConstructionModel`:
   1. Adds lookback period for return calculation
   2. Adds exception for null magnitude
   3. Refactors indicator history warm-up
3. Other minor fixes:
   1. Default target return was 2 instead of 0.02 (2%)
   2. Proper removal of consolidator subscriptions
This commit is contained in:
AlexCatarino
2018-04-06 00:26:44 +01:00
parent 92238a02fc
commit 133d2cd461
3 changed files with 87 additions and 44 deletions
@@ -58,7 +58,7 @@ class MeanVarianceOptimizationAlgorithm(QCAlgorithmFramework):
# set algorithm framework models
self.UniverseSelection = ManualUniverseSelectionModel(symbols)
self.SetAlpha(HistoricalReturnsAlphaModel(period = 63, resolution = Resolution.Daily))
self.SetAlpha(HistoricalReturnsAlphaModel(resolution = Resolution.Daily))
self.SetPortfolioConstruction(MeanVarianceOptimizationPortfolioConstructionModel(optimization_method = self.maximum_sharpe_ratio))
self.Execution = ImmediateExecutionModel()
self.RiskManagement = NullRiskManagementModel()
@@ -72,7 +72,7 @@ class MeanVarianceOptimizationAlgorithm(QCAlgorithmFramework):
'''Maximum Sharpe Ratio optimization method'''
# Objective function
fun = lambda weights: self.sharpe_ratio(returns, weights)
fun = lambda weights: -self.sharpe_ratio(returns, weights)
# Constraint #1: The weights can be negative, which means investors can short a security.
constraints = [{'type': 'eq', 'fun': lambda w: np.sum(w) - 1}]
@@ -95,4 +95,4 @@ class MeanVarianceOptimizationAlgorithm(QCAlgorithmFramework):
def sharpe_ratio(self, returns, weights):
annual_return = np.dot(np.matrix(returns.mean()), np.matrix(weights).T).item()
annual_volatility = np.sqrt(np.dot(weights.T, np.dot(returns.cov(), weights)))
return -annual_return/annual_volatility
return annual_return/annual_volatility