| Overall Statistics |
|
Total Trades 18 Average Win 0% Average Loss -1.17% Compounding Annual Return -99.863% Drawdown 46.800% Expectancy -1 Net Profit -43.914% Sharpe Ratio -7.871 Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha -3.325 Beta -124.157 Annual Standard Deviation 0.701 Annual Variance 0.492 Information Ratio -7.895 Tracking Error 0.701 Treynor Ratio 0.044 Total Fees $279.12 |
import numpy as np
class CalibratedTransdimensionalComputer(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2018, 10, 1) # Set Start Date
self.SetEndDate(2018,11,1)
self.SetCash(1000000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.CoarseSelectionFunction)
self.symbols = []
#store the maximum prices
self.historicalhigh = {}
self.ma10 = {}
self.init_flag = True
def OnData(self, data):
long_list = []
for symbol in self.symbols:
if data.ContainsKey(symbol) and data[symbol] is not None and symbol in self.ma10.keys():
self.ma10[symbol].Add(data[symbol].Close)
if data[symbol].Close > self.historicalhigh[symbol][0]:
self.historicalhigh[symbol].Add(data[symbol].Close)
long_list.append(symbol)
self.Log(f'{self.Time}: rollling updated')
if self.Portfolio.Invested:
for symbol in self.Portfolio.Keys:
if symbol in self.ma10.keys() and self.Portfolio[symbol].Invested:
ma10 = 0.0
for i in range(0,10):
ma10 += self.ma10[symbol][i]
ma10 = ma10/10
if self.ma10[symbol][0] <= ma10:
self.Liquidate(symbol)
self.Log(f'{self.Time}: liquidation finished')
for symbol in long_list:
if not self.Portfolio[symbol].Invested and self.Portfolio.MarginRemaining > 1/len(long_list)*self.Portfolio.TotalPortfolioValue:
self.SetHoldings(symbol, 1/len(long_list))
self.Log(f'{self.Time}: order placement finished')
def CoarseSelectionFunction(self, coarse):
self.Log(f'{self.Time}: Coarse begins')
selected = [x for x in coarse if x.HasFundamentalData and x.Price > 3]
filtered = sorted(selected, key=lambda x: x.DollarVolume, reverse=True)
if len(coarse) == 0:
self.Log(f'{self.Time}: No data for coarse!')
return self.symbols
else:
self.symbols = [x.Symbol for x in filtered[:30]]
if self.init_flag:
#I don't know why hist.fillna() doesn't work so I have to address NaN at line:90/91
self.inti_flag = False
hist = self.History(self.symbols, 252*5, Resolution.Daily).fillna(method= 'pad')
hist = hist.fillna(hist.sum(axis = 0)/hist.notnull().sum())
hist = hist.fillna(0)
hist = hist.close.unstack(level=0)
self.Log(f'Numbers of NaN: {hist.isnull().sum().sum()}')
for symbol in self.symbols:
if not symbol in self.historicalhigh.keys():
self.historicalhigh[symbol] = RollingWindow[Decimal](1)
if str(symbol) in hist.columns and symbol in self.historicalhigh.keys():
self.historicalhigh[symbol].Add(np.max(hist[str(symbol)]))
else:
self.symbols.remove(symbol)
for symbol in self.symbols:
if not symbol in self.ma10.keys():
self.ma10[symbol] = RollingWindow[Decimal](10)
if str(symbol) in hist.columns and symbol in self.ma10.keys():
self.Log(f'{str(symbol)} begin to be added into self.ma10')
for i in range(-1,-11,-1):
self.Log(f'{i}: {hist[str(symbol)][i]}')
if np.isnan(hist[str(symbol)][i]):
hist[str(symbol)][i] = 0
self.ma10[symbol].Add(hist[str(symbol)][i])
self.Log(f'{str(symbol)} finish to be added into self.ma10')
self.Log(f'{self.Time}: CoarseSelection finished')
return self.symbols