| Overall Statistics |
|
Total Trades 342 Average Win 0.11% Average Loss -0.09% Compounding Annual Return 1.748% Drawdown 0.600% Expectancy 0.154 Net Profit 3.497% Sharpe Ratio 1.514 Probabilistic Sharpe Ratio 82.449% Loss Rate 49% Win Rate 51% Profit-Loss Ratio 1.28 Alpha 0.014 Beta 0.003 Annual Standard Deviation 0.009 Annual Variance 0 Information Ratio -0.57 Tracking Error 0.135 Treynor Ratio 4.254 Total Fees $353.25 |
#from Execution.VolumeWeightedAveragePriceExecutionModel import VolumeWeightedAveragePriceExecutionModel
import numpy as np
class MultidimensionalModulatedRegulators(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2018, 1, 16) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
#self.SetExecution(VolumeWeightedAveragePriceExecutionModel())
self.symbols = [Symbol.Create("USO", SecurityType.Equity, Market.USA),
Symbol.Create("SCO", SecurityType.Equity, Market.USA),
Symbol.Create("ERX", SecurityType.Equity, Market.USA),
Symbol.Create("SHV", SecurityType.Equity, Market.USA),
Symbol.Create("SHY", SecurityType.Equity, Market.USA),
Symbol.Create("VGT", SecurityType.Equity, Market.USA),
Symbol.Create("OIH", SecurityType.Equity, Market.USA),
Symbol.Create("XLB", SecurityType.Equity, Market.USA),
Symbol.Create("GDX", SecurityType.Equity, Market.USA),
Symbol.Create("XLY", SecurityType.Equity, Market.USA),
Symbol.Create("SLV", SecurityType.Equity, Market.USA),
Symbol.Create("XLF", SecurityType.Equity, Market.USA),
Symbol.Create("SMH", SecurityType.Equity, Market.USA),
Symbol.Create("XLI", SecurityType.Equity, Market.USA),
Symbol.Create("XLU", SecurityType.Equity, Market.USA),
Symbol.Create("XLV", SecurityType.Equity, Market.USA),
Symbol.Create("GLD", SecurityType.Equity, Market.USA),
Symbol.Create("QQQ", SecurityType.Equity, Market.USA),
Symbol.Create("IEI", SecurityType.Equity, Market.USA),
Symbol.Create("XLE", SecurityType.Equity, Market.USA),
Symbol.Create("VDE", SecurityType.Equity, Market.USA)]
self.SetUniverseSelection( ManualUniverseSelectionModel(self.symbols) )
self.UniverseSettings.Resolution = Resolution.Minute
# Schedule the rebalance function to execute at the begining of each month
# self.Schedule.On(self.DateRules.MonthStart(self.spy),
# self.TimeRules.BeforeMarketClose(self.spy, 30), Action(self.rebalance))
def OnData(self, data):
'''def rebalance(self):OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.
Arguments:
data: Slice object keyed by symbol containing the stock data
'''
self.constant_weights = [-0.255348, -0.131087, -0.101415, -0.054271, -0.026654, -0.014632, -0.010338, -0.006401, -0.003293,
-0.002393, -0.002374, -0.001465, 0.001768, 0.006987, 0.007043, 0.008843, 0.011171, 0.016230, 0.039692, 0.134397, 0.164197]
self.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)
total += np.abs(self.constant_weights[i] - curr)
if total > 0.05:
self.Debug(total)
self.rebalance = True
if self.rebalance:
for i, sym in enumerate(self.symbols):
oq = self.CalculateOrderQuantity(sym, self.constant_weights[i])
lp = self.Securities[sym].AskPrice
if oq > 0: lp = self.Securities[sym].BidPrice
if oq != 0: self.LimitOrder(sym, oq, lp)
if not self.Portfolio.Invested:
for i, sym in enumerate(self.symbols):
self.SetHoldings(sym, self.constant_weights[i])