| Overall Statistics |
|
Total Trades 8 Average Win 0.41% Average Loss 0% Compounding Annual Return 798.757% Drawdown 0.800% Expectancy 0 Net Profit 2.436% Sharpe Ratio 9.538 Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 0 Beta 110.715 Annual Standard Deviation 0.128 Annual Variance 0.016 Information Ratio 9.461 Tracking Error 0.128 Treynor Ratio 0.011 Total Fees $9.63 |
import pandas as pd
class CoarseFundamentalTop3Algorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2019,6,4)
self.SetEndDate(2019,6,8)
self.SetCash(50000)
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.CoarseSelectionFunction, self.SelectFine)
self.IndustryCode = {}
self.__numberOfSymbols = 3
self.__numberOfSymbolsFine = 3
self._changes = None
def OnData(self, data):
if self._changes is None: return
for security in self._changes.RemovedSecurities:
if security.Invested:
self.Liquidate(security.Symbol)
for security in self._changes.AddedSecurities:
self.SetHoldings(security.Symbol, 1 / self.__numberOfSymbols)
self._changes = None
def OnSecuritiesChanged(self, changes):
self._changes = changes
def CoarseSelectionFunction(self, coarse):
CoarseWithFundamental = [x for x in coarse if x.HasFundamentalData]
self.Log(coarse[-1].Time)
sortedByVolume = sorted(CoarseWithFundamental, key=lambda x: x.DollarVolume, reverse=True)
for x in sortedByVolume[:self.__numberOfSymbols]:
self.Log(x.Symbol.Value)
self.Log(x.DollarVolume)
return [ x.Symbol for x in sortedByVolume[:self.__numberOfSymbols] ]
def SelectFine(self, fine):
IndustryCode = {}
for x in fine:
if x.AssetClassification.MorningstarIndustryGroupCode not in IndustryCode:
IndustryCode[x.AssetClassification.MorningstarIndustryGroupCode] = [x.Symbol]
else:
IndustryCode[x.AssetClassification.MorningstarIndustryGroupCode].append(x.Symbol)
history_price = {}
pre_symbols = []
for value in IndustryCode.values():
for k in set(value):
pre_symbols.append(self.AddEquity(str(k.Value), Resolution.Minute).Symbol)
symbols = []
for value in IndustryCode.values():
for j in set(value):
hist = self.History(j, datetime(2019, 6, 4, 0), datetime(2019, 6, 4, 23), Resolution.Minute)
self.Log(hist)
if hist.empty:
value.remove(j)
else:
symbols.append(j)
history_price[str(j.Value)] = []
for tuple in hist.loc[str(j.Value)].itertuples():
history_price[str(j.Value)].append(float(tuple.close))
if len(history_price[str(j.Value)]) < 390:
value.remove(j)
symbols.remove(j)
history_price.pop(str(j.Value))
df_history_price = pd.DataFrame.from_dict(history_price)
return symbols