| Overall Statistics |
|
Total Trades 1264 Average Win 0.18% Average Loss -0.14% Compounding Annual Return 37.247% Drawdown 13.300% Expectancy 0.341 Net Profit 30.929% Sharpe Ratio 2.009 Probabilistic Sharpe Ratio 73.148% Loss Rate 41% Win Rate 59% Profit-Loss Ratio 1.26 Alpha 0.364 Beta 0.155 Annual Standard Deviation 0.196 Annual Variance 0.038 Information Ratio 0.557 Tracking Error 0.356 Treynor Ratio 2.539 Total Fees $1816.79 |
from Execution.VolumeWeightedAveragePriceExecutionModel import VolumeWeightedAveragePriceExecutionModel
import numpy as np
syms = ['UCC', 'UYM', 'UCO', 'SSO', 'SPXL', 'TECL', 'YCL', 'ROM', 'DDM', 'AGQ', 'UPW', 'ULE', 'QLD',
'UGL', 'UWM', 'DIG', 'MVV', 'UXI', 'EDC', 'SAA', 'RXL', 'UYG', 'USD', 'URE', 'TNA', 'FAS', 'ERX']
neg_syms = ['SCC', 'SMN', 'SCO', 'SDS', 'SPXS', 'TECS', 'YCS', 'REW', 'DXD', 'ZSL', 'SDP', 'EUO', 'QID',
'GLL', 'TWM', 'DUG', 'MZZ', 'SIJ', 'EDZ', 'SDD', 'RXD', 'SKF', 'SSG', 'SRS', 'TZA', 'FAZ', 'ERY']
static_weights = [0.03706180, -0.03707334, -0.03707561, 0.03706536, 0.03707422,
-0.03707530, -0.03700968, 0.03706650, 0.03706156, 0.03707561,
0.03706913, -0.03699909, 0.03705006, 0.03706984, -0.03640344,
-0.03707560, 0.03706748, 0.03707518, -0.03700378, 0.03707037,
0.03707295, 0.03707349, 0.03707537, -0.03706927, -0.03706570,
-0.03704468, -0.03707559]
class MultidimensionalModulatedRegulators(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 1) # Set Start Date
self.SetCash(1000000) # Set Strategy Cash
self.SetExecution(VolumeWeightedAveragePriceExecutionModel())
self.symbols = []
for i in range(len(syms)):
if static_weights[i] < 0: syms[i] = neg_syms[i]
self.symbols.append(Symbol.Create(syms[i], SecurityType.Equity, Market.USA))
static_weights[i] = np.abs(static_weights[i])
#self.Debug(syms[i])
self.SetUniverseSelection( ManualUniverseSelectionModel(self.symbols) )
self.UniverseSettings.Resolution = Resolution.Hour
self.AddEquity('SPY', Resolution.Hour)
self.SetBenchmark('SPY')
self.SetBrokerageModel(AlphaStreamsBrokerageModel())
self.constant_weights = np.abs([0.03706180, -0.03707334, -0.03707561, 0.03706536, 0.03707422,
-0.03707530, -0.03700968, 0.03706650, 0.03706156, 0.03707561,
0.03706913, -0.03699909, 0.03705006, 0.03706984, -0.03640344,
-0.03707560, 0.03706748, 0.03707518, -0.03700378, 0.03707037,
0.03707295, 0.03707349, 0.03707537, -0.03706927, -0.03706570,
-0.03704468, -0.03707559])
self.constant_weights /= np.sum(self.constant_weights)
self.leverage = 1.5
def OnData(self, data):
rebalance = False
if self.Portfolio.TotalHoldingsValue > 0:
total = 0.0
for i, sym in enumerate(self.symbols):
curr = (self.Securities[sym].Holdings.HoldingsValue/self.Portfolio.TotalHoldingsValue)
diff = self.constant_weights[i] - curr
total += np.abs(diff)
if total > 0.08:
rebalance = True
if rebalance or (not self.Portfolio.Invested):
for i, sym in enumerate(self.symbols):
if self.constant_weights[i] != 0:
self.SetHoldings(sym, self.constant_weights[i] * self.leverage)