| Overall Statistics |
|
Total Trades 49 Average Win 0.04% Average Loss -0.01% Compounding Annual Return 1.638% Drawdown 0.100% Expectancy 1.588 Net Profit 0.379% Sharpe Ratio 2.952 Probabilistic Sharpe Ratio 87.444% Loss Rate 42% Win Rate 58% Profit-Loss Ratio 3.44 Alpha 0.013 Beta 0.002 Annual Standard Deviation 0.005 Annual Variance 0 Information Ratio -4.288 Tracking Error 0.099 Treynor Ratio 7.66 Total Fees $49.00 |
OrderTypeKeys = [
'Market', 'Limit', 'StopMarket', 'StopLimit', 'MarketOnOpen',
'MarketOnClose', 'OptionExercise',
]
OrderTypeCodes = dict(zip(range(len(OrderTypeKeys)), OrderTypeKeys))class DynamicHorizontalChamber(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019, 1, 7)
self.SetEndDate(2019, 4, 1)
self.SetCash(100000)
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.SelectionFunction)
self.averages = { }
def SelectionFunction(self, universe):
selected = []
universe = sorted(universe, key=lambda c: c.DollarVolume, reverse=True)
universe = [c for c in universe if c.Price > 100][:100]
for coarse in universe:
symbol = coarse.Symbol
if symbol not in self.averages:
history = self.History(symbol, 200, Resolution.Daily)
self.averages[symbol] = Selection(history)
self.averages[symbol].update(self.Time, coarse.AdjustedPrice)
if self.averages[symbol].is_ready() and self.averages[symbol].stt.Current.Value < 2:
selected.append(symbol)
return selected[:100]
def OnSecuritiesChanged(self, changes):
self.Log(f"OnSecuritiesChanged({self.Time}):: {changes}")
for security in changes.RemovedSecurities:
if security.Invested:
self.Liquidate(security.Symbol)
for security in changes.AddedSecurities:
self.SetHoldings(security.Symbol, 0.10)
class Selection():
def __init__(self,history):
self.stt = StandardDeviation(200)
for bar in history.itertuples():
self.stt.Update(bar.Index[1],bar.close)
def is_ready(self):
return self.stt.IsReady
def update(self, time, price):
self.stt.Update(time,price)