| Overall Statistics |
|
Total Trades 2157 Average Win 0.02% Average Loss -0.01% Compounding Annual Return 13.901% Drawdown 12.000% Expectancy 0.584 Net Profit 5.443% Sharpe Ratio 0.67 Probabilistic Sharpe Ratio 39.558% Loss Rate 52% Win Rate 48% Profit-Loss Ratio 2.27 Alpha -0.088 Beta 0.856 Annual Standard Deviation 0.176 Annual Variance 0.031 Information Ratio -1.217 Tracking Error 0.101 Treynor Ratio 0.138 Total Fees $2157.00 |
import math
import pandas as pd
from io import StringIO
data_url = "https://www.dropbox.com/s/pwm8wlncayp1clh/trump_beta.csv?dl=1"
class MultidimensionalCalibratedAtmosphericScrubbers(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 6, 1) # Set Start Date
self.SetCash(100000) # Set Strategy Cash
symbols = self.get_symbols()
self.AddUniverseSelection( ManualUniverseSelectionModel(symbols) )
self.AddAlpha( TrumpBetaAlphaModel() )
self.SetPortfolioConstruction( EqualWeightingPortfolioConstructionModel() )
self.SetExecution( ImmediateExecutionModel() )
def get_symbols(self):
constituents = pd.read_csv(StringIO(self.Download(data_url)), index_col='Date').columns
return [Symbol.Create(c, SecurityType.Equity, Market.USA) for c in constituents]
class TrumpBetaAlphaModel:
def __init__(self):
self.thresh = 1/4
def Update(self, algorithm, slice):
insights = []
trump_beta = pd.Series({k: v.Value for k, v in slice.Get[TrumpBeta]().items()})
low_trump_beta = abs(trump_beta).sort_values()[math.floor(self.thresh*len(trump_beta)):]
for security in low_trump_beta.keys():
if algorithm.Securities.ContainsKey(security):
insight = Insight.Price(security, timedelta(days = 7), InsightDirection.Up)
insights.append(insight)
return insights
def OnSecuritiesChanged(self, algorithm, changes):
for added in changes.AddedSecurities:
algorithm.AddData(TrumpBeta, added.Symbol)
for removed in changes.RemovedSecurities:
algorithm.RemoveSecurity(removed.Symbol)
class TrumpBeta(PythonData):
def GetSource(self, config, date, isLive):
return SubscriptionDataSource(data_url, SubscriptionTransportMedium.RemoteFile);
def Reader(self, config, line, date, isLive):
data = line.split(',')
if not (line.strip() and line[0].isdigit()):
self.columns = {data[i]: i for i in range(len(data))}
return None
ticker = config.Symbol.Value
trump_beta = TrumpBeta()
trump_beta.Symbol = Symbol.Create(ticker, SecurityType.Equity, Market.USA)
trump_beta.EndTime = pd.to_datetime(data[self.columns['Date']]) + timedelta(days=1) # Make sure we only get this data AFTER trading day - don't want forward bias.
value = data[self.columns[ticker]]
if not value: return None
trump_beta.Value = float(value)
return trump_beta