| Overall Statistics |
|
Total Trades 81 Average Win 0.02% Average Loss 0.00% Compounding Annual Return 8.242% Drawdown 0.000% Expectancy 6.002 Net Profit 0.457% Sharpe Ratio 8.033 Probabilistic Sharpe Ratio 99.981% Loss Rate 31% Win Rate 69% Profit-Loss Ratio 9.11 Alpha 0.086 Beta -0.029 Annual Standard Deviation 0.008 Annual Variance 0 Information Ratio -4.871 Tracking Error 0.133 Treynor Ratio -2.296 Total Fees $0.00 |
#TODO implment spread read for order pricing
import pandas as pd
import numpy as np
from Execution.ImmediateExecutionModel import ImmediateExecutionModel
from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel
def to_dataframe(data_c):
# Helper function to make a dataframe from the coarse object.
# Then we can use all the handy dataframe methods.
# Set the 'coerce_float' parameter to get meaningful datatypes
# otherwise all the fields will be un-useful generic objects.
data = [(
stock.Price,
stock.Volume,
stock.DollarVolume,
stock.HasFundamentalData)
for stock in data_c]
symbols = [stock.Symbol for stock in data_c ]
labels = ['price', 'volume', 'dollar_volume', 'has_fundamentals']
data_df = pd.DataFrame.from_records(
data,
index=symbols,
columns=labels,
coerce_float=True)
return data_df
class VentralHorizontalThrustAssembly(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 11, 6) # Set Start Date
self.SetEndDate(2020, 11, 28)
self.SetCash(50000) # Set Strategy Cash
self.spy = self.AddEquity("SPY", Resolution.Daily)
self.swir = self.AddEquity("SWIR", Resolution.Daily)
self.clne = self.AddEquity("CLNE", Resolution.Daily)
self.tsla = self.AddEquity("TSLA", Resolution.Daily)
self.UniverseSettings.Resolution = Resolution.Daily
self.SetSecurityInitializer(self.CustomSecurityInitializer)
#self.AddAlpha(PsychSignalAlphaModel())
#self.AddUniverse(self.CoarseSelectionFunction)
#self.SetExecution(ImmediateExecutionModel())
#self.SetSecurityInitializer(self.CustomSecurityInitializer)
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.__numberOfSymbols = 100
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.BeforeMarketClose("SPY",16), Action(self.OpenPositions))
def CustomSecurityInitializer(self, security):
security.SetDataNormalizationMode(DataNormalizationMode.Raw)
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(9, 00), Action(self.BeforeTradingStart))
def CustomSecurityInitializer(self, security):
security.SetDataNormalizationMode(DataNormalizationMode.Raw)
'''
def OnSecuritiesChanged(self, changes):
for i in changes.AddedSecurities:
self.Securities[i].FeeModel = ConstantFeeModel(0)
self.Securities[i].SlippageModel = ConstantSlippageModel(0)
'''
def OnData(self, data):
'''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
'''
pass
# sort the data by daily dollar volume and take the top 'NumberOfSymbols'
def CoarseSelectionFunction(self, coarse):
'''
data_df = to_dataframe(coarse)
my_universe = (data_df.
query("(price > 1) and (price < 12.5) and (dollar_volume > 1500000) and has_fundamentals").
#nlargest(20, 'dollar_volume').
index.tolist())
self.universe = my_universe
return self.universe
'''
# sort descending by daily dollar volume
filterCoarse = [x for x in coarse if x.HasFundamentalData
and x.Price > 2.5
and x.Price < 99
and x.DollarVolume > 1000000
and x.DollarVolume < 50000000]
#filterCoarse = [x for x in filteredCoarse if x.HasFundamentalData and x.Price < 12.5]
#filterCoarse = [x for x in filteredCoarse if x.HasFundamentalData and x.DollarVolume < 1500000]
# return the symbol objects of the top entries from our sorted collection
#return [ x.Symbol for x in sortedByDollarVolume[:self.__numberOfSymbols] ]
self.universe = [x.Symbol for x in filterCoarse]
self.Log(len(self.universe))
return self.universe
def OpenPositions(self):
for i in self.ActiveSecurities.Keys:
self.Securities[i].FeeModel = ConstantFeeModel(0)
self.Securities[i].SlippageModel = ConstantSlippageModel(0)
self.MarketOnCloseOrder("SWIR", 1)
self.MarketOnCloseOrder("CLNE", 1)
self.MarketOnCloseOrder("TSLA", 1)
def BeforeTradingStart(self):
self.Liquidate()