Commit Graph

309 Commits

Author SHA1 Message Date
Jared e3cd28cae3 Merge pull request #2643 from dd-w/feature/portfolio_max_drawdown
Feature: Maximum Portfolio Drawdown
2018-11-05 09:25:26 -08:00
David c35649b1b5 Add support for trailing portfolio stop loss 2018-11-04 08:41:38 +08:00
David f2aacb2645 Removed logging message 2018-10-29 08:57:54 +00:00
David b59550dd59 Initial TrailingStop implementation
Restructured


Update message


Added removal of trailing highs for unnecessary securities


Add logging message


Improvements


Rename


Add regression Algorithm


Changed to use TradeBar values instead of only current price


Cleaned msg layout


Update Regression test
2018-10-29 08:57:44 +00:00
David 879843c9a8 Refactored TotalDrawdownPercent() 2018-10-26 09:03:07 +01:00
David f41315cb69 Remove non-conforming features 2018-10-25 23:40:50 +01:00
David dfd8027715 Add regression algorithm - MaximumPortfolioDrawdownFrameworkAlgorithm 2018-10-25 00:03:57 +01:00
David 3b089af75a Added MaximumDrawdownPercentPortfolio Risk Management Model
Updates
2018-10-25 00:03:36 +01:00
Martin Molinero 2c2612aa71 Addressing reviews
- SecurityManager will no longer inherit ISecurityService
- Rebase from master
2018-10-18 16:45:16 -03:00
Martin Molinero a288648929 Creating new ISecurityService
- Adding new ISecurityService and its implementation SecurityService.
Expose by SecurityManager.
This class will expose a method for creating new securities. The
SecurityManager is exposing this new interface, calling _securityService
internally, so Future/OptionUniverseSelectionModel.cs can use it
- Replacing all usages of SecurityManager.CreateSecurity for new
ISecurityService
- Modifying `Cash.cs` and `CashBook.cs` `EnsureCurrencyDataFeeds()` to
return newly added `SubscriptionDataConfig` instead of `Security`. This
will avoid using `Security.Subscriptions` at call site.
- Moving old SecurityManager.CreateSecurity into new
SecurityServiceTests.cs
2018-10-18 16:25:32 -03:00
Michael Handschuh a875023837 Merge pull request #2605 from QuantConnect/feature-2581-multiple-risk-models
Add CompositeRiskManagementModel
2018-10-18 12:25:04 -04:00
Michael Handschuh 72327507ad Rename MaximumUnrealizedProfitPerSecurty->MaximumUnrealizedProfitPercentPerSecurity
While it is a long name, this aims to provide consistency with it's inverted
brethern, the MaximumDrawdownPercentPerSecurity risk model
2018-10-15 13:52:41 -04:00
Michael Handschuh 446e07aa56 Fix composition bug in CompositeRiskManagementModel
The CompositeRiskManagementModel aims to provide support for multiple
risk management models. In order to accomplish this, it must respect
the return values from each individual model. As previously written,
the composite model was allowing models run later to completely nuke
the targets produced by earlier models. This change performs the
composition of targets using the same technique as is used when over
laying the risk adjusted targets on top of the portfolio construction
model's targets. This approach gives preference, by symbol, to the
risk adjusted targets, but if there is no risk adjusted target, then
it uses the targets from the previous step. For example, if targets
for A, B, C, and D are produced by PCM, then risk model 1 adjusts to
zero targets for B and cuts the targets for C in half, these are then
piped to risk model 2 (A, C/2, D). Risk model 2 may return ZERO targets.
This doesn't mean we should remove all the targets, it simply means
that the risk model didn't adjust any and we should use the output
from risk model 1. Now, let's say risk model 2 zeroes out A and cuts
B in half again, the final result should (and now is) C/4, D. IOW,
risk models only return deltas, things to be changed, so returning
nothing means there are no changes.
2018-10-15 13:52:41 -04:00
Michael Handschuh d818b56d6e Add MaximumUnrealizedProfitPerSecurity risk model
This is the inverse of the MaximumDrawdownPercentPerSecurity risk model.
It's goal is to liquidate holdings for a security when the unrealized profit
passes a specified threshold. This can viewed as a 'take the money and run'
risk model.
2018-10-13 03:30:13 -04:00
Martin Molinero eaba3ab24e Fix ManualUniverse duplicate effort
- Removed usages of algorithm.Securities.key as a parameter for the
`ManualUniverseSelectionModel()` since those securities, added through
`AddXXXX` calls will be managed by the `UserDefinedUniverse`. This was
causing for Universes to try to add the same subscription requests
- Adding new empty constructor for ManualUniverseSelectionModel,
required for Python
- ManualUniverse will return any existing SDC for the
symbol. This is for maintaining existing behavior and
preventing breaking changes: Specifically motivated by usages of
Algorithm.Securities.Keys as constructor parameter of the
ManualUniverseSelectionModel, since those Symbols added by Addxxx()
calls will already be managed by the UserDefinedUniverse
- Making some format modifications to aling with used Lean formatting
2018-10-12 18:30:04 -03:00
David 76e5ae4784 Fix namespace 2018-10-08 22:11:07 +01:00
Michael Handschuh cdd1ad83c6 Merge pull request #2572 from Martin-Molinero/refactor-2571-universe-getsubscriptionrequests-createsecurity
Refactor Universe.GetSubscriptionRequests - Obsolete Universe.CreateSecurity
2018-10-08 11:53:48 -04:00
David 9e25420ba5 Convert to RiskManagmentModel 2018-10-06 15:01:07 +01:00
David cbb7eda706 Copy CompositeAlphaModel.cs 2018-10-06 14:34:18 +01:00
Martin Molinero 5221999b88 Addressing reviews
- Some formatting, comments changes
- Removing SubscriptionManager from new FuturesChainUniverse constructor
- Making Option and Future properties in FutureChainUniverse and
OptionChainUniverse
2018-10-04 16:08:12 -03:00
Stefano Raggi 5c9b81cef1 Fix Python initialization and imports for multiple tests 2018-10-02 20:28:13 +02:00
Martin Molinero 4e424c4f19 Refactor UserDefinedUniverse, UniverseSelection
- Obsolete Universe.CreateSecurity, Universe.SetSecurityInitializer,
Universe.GetSubscriptionRequests(Security security, DateTime currentTimeUtc, DateTime maximumEndTimeUtc)
- Adding new GetSubscriptionRequests() overload that will receive
instance which implementes new ISubscriptionService
- UserDefinedUniverse will stop using Security.Subscriptions
2018-10-02 09:59:23 -03:00
Stefano Raggi 399274b29b Fix ScheduledUniverseSelectionModelRegressionAlgorithm.py regression failure 2018-09-28 15:17:38 +02:00
AlexCatarino 340d1d81ff Adds key check after History requests in framework models …
`RsiAlphaModel` and `BlackLittermanOptimizationPortfolioConstructionModel` didn't have a key check after a history request. If a history request retuns no data for a given symbol, trying to access the pandas dataframe results in a `KeyError`.
2018-09-19 17:39:31 +01:00
AlexCatarino 8b8d2d2d6f Adds key check after History requests in framework models
`RsiAlphaModel` and `BlackLittermanOptimizationPortfolioConstructionModel` didn't have a key check after a history request. If a history request retuns no data for a given symbol, trying to access the pandas dataframe results in a `KeyError`.
2018-09-19 16:11:50 +01:00
Stefano Raggi 0f86363def Add missing null checks in Python models 2018-08-21 18:23:50 +02:00
Stefano Raggi c694e9faae Post merge fixes 2018-08-21 18:10:52 +02:00
Stefano Raggi cead4e608e Update EqualWeightingPortfolioConstructionModel to check for null targets 2018-08-21 18:10:52 +02:00
Stefano Raggi 4abc525a38 PortfolioTarget.Percent returns null if error 2018-08-21 18:10:51 +02:00
Michael 144765db08 Merge pull request #2430 from QuantConnect/bug-2426-manual-universe-selection-model-name-fix
Fix symbol name in ManualUniverseSelectionModel
2018-08-21 11:44:49 -04:00
Stefano Raggi 9d2ed09068 Fix symbol name in ManualUniverseSelectionModel 2018-08-21 17:03:24 +02:00
AlexCatarino 76cc75006c Refactors BlackLittermanOptimizationPortfolioConstructionModel
1. Apply the pattern used in `EqualWeightingPortfolioConstructionModel`
2. Change the logic to compute the views from the insights.
3. Change the logis to compute the posterior mean and covariance

Use `UnconstrainedMeanVariancePortfolioOptimizer` in `BlackLittermanPortfolioOptimizationFrameworkAlgorithm` to bypass the difference in regression tests with `IPortfolioOptimizer` that rely on different algorithms in C# and python.

Adds unit tests for BLOPCV to test the implementation against Black and Litterman 1999 paper.
2018-08-20 21:01:14 +01:00
AlexCatarino 9c99794bfb Adds covariance parameter in IPortfolioOptimizer.Optimize
Add a multi-dimensional array of double representing the covariance. Some models, e.g., Black-Litterman may want to optimize a covariance that is different from the historical one.

Adds UnconstrainedMeanVariancePortfolioOptimizer: a simple optimizer that has a solution, therefore no numerical optimization method is required.
2018-08-20 20:51:02 +01:00
AlexCatarino 45c8df325e Fixes the time guard condition using less and equal
If `algorithm.UtcTime` is equal to `nextExpireTime`, the model should not emit new targets.
2018-08-13 19:45:25 +01:00
AlexCatarino 239a5a909e Fixes EqualWeightingPortfolioConstructionModel not flattening expired insights
- When there are or aren'tt new insights, the EqualWeightingPortfolioConstructionModel will creates a target to flatten delisted securities from the universe of expired insights.
- Helper methods were added to deal with removing expired insights and getting active ones and used in `EqualWeightingPortfolioConstructionModel`
- Adds unit test
- Updates framework algorithms
2018-08-13 19:45:25 +01:00
AlexCatarino d4f67b212d Refactors RsiAlphaModel
The model was assuming that we could only add elements to the dictionary field if there was data in the history request which is not required.
2018-08-08 12:10:22 +01:00
Jared b9d4536b08 Merge pull request #2362 from QuantConnect/bug-2357-fix-insight-close-time
Fix insight close and analysis times
2018-08-07 16:26:18 -04:00
AlexCatarino 48c87ffb93 Refactors RsiAlphaModel logic in OnSecuritiesChanged
The history request to warm up the RSI indicator is performed before it is created.
2018-08-07 20:53:17 +01:00
Michael Handschuh 4fd16f6daf Fix resolution of insight close times, allow user defined close times
Fixes a bug where we were using the security's data resolution to compute
the insight's close time. This led a case such as insight.Period == 20days
to step 20days worth of tradable minutes (assuming minute data resolution),
yielding a close time that was very far in the future.

We also add different means of specifying an insight's period/close time:
1. Specify insight period as a TimeSpan and we compute close time
2. Specify insight period and a resolution and bar count and we compute close time
3. Specify insight close time local directly and we compute the insight period

The key here is maintaining consistency between the three different approaches
which is heavily validated with the corresponding unit tests.

Edits also made to trust the insight's close time as the analysis end time in
the case where the analysis period == insight period (extra analysis period = 0).
Given the current setup (extra analysis period == 0), this guarantees that close
and analysis end times are equivalent.

Regression statistics were updated and expectedly we get many more insights that
have completed analysis, and as such, average scores have also changed.
2018-08-07 11:21:11 -04:00
Michael a366063aed Merge pull request #2354 from AlexCatarino/bug-2353-fix-equal-weighting-pcm
Fixes EqualWeightingPortfolioConstructionModel
2018-08-07 10:54:37 -04:00
AlexCatarino e0c380d08c Fixes EqualWeightingPortfolioConstructionModel
Adds targets with direction zero to remove invested securities that do not have active insights.
2018-08-06 13:19:03 +01:00
Stefano Raggi 089199dadf Fix Python version of RsiAlphaModel to be same as C# version 2018-08-03 20:37:50 +02:00
Michael ed5a8254cc Merge pull request #2338 from QuantConnect/risk-management-models-unit-tests
Add unit tests for MaximumDrawdownPercentPerSecurity risk management model
2018-08-02 10:49:02 -04:00
Michael cfb05d190f Merge pull request #2328 from AlexCatarino/feature-2326-implements-futures-template-framework
Implements BasicTemplateFuturesFrameworkAlgorithm
2018-08-02 10:44:09 -04:00
Stefano Raggi c6092648bd Update Python version of MaximumDrawdownPercentPerSecurity to be same as C# version 2018-08-02 12:51:27 +02:00
AlexCatarino 38b03bfd28 Adds XML documentation for selection models 2018-08-01 18:47:46 +01:00
AlexCatarino 0bc157a8e7 Removes logging from framework models and algorithms
Shipped modules should be silent unless error case.
2018-07-31 19:16:17 +01:00
AlexCatarino 47b3abfca2 Improves the logic to select active insights
- Also: adds unit tests for `EqualWeightingPortfolioConstructionModel`
2018-07-31 19:01:02 +01:00
AlexCatarino 01a77a274b Fixes InsightDirection.Flat allocation in EqualWeightingPortfolioConstructionModel
The allocation should be calculated for symbols which last insights are not `InsightDirection.Flat`. For example, if the last insight of SPY and of IBM are Up, and of AIG is flat, then 50% of equity should be allocated in SPY, 50% in IBM and 0% in AIG. Before this fix, we would have 33% SPY, 33%, IBM and 0% AIG.
2018-07-31 12:09:24 +01:00
AlexCatarino e5ed09924b Implements BasicTemplateFuturesFrameworkAlgorithm
This algorithm shows how to implement a futures strategy in a framework algorithm.
`FutureUniverseSelectionModel` portfolio selection model was implemented to provide a base class to help create other futures universe selection models.
2018-07-30 22:21:47 +01:00