| Overall Statistics |
|
Total Trades 1827 Average Win 0.32% Average Loss -0.31% Compounding Annual Return 153.815% Drawdown 23.600% Expectancy 0.099 Net Profit 38.277% Sharpe Ratio 3.368 Probabilistic Sharpe Ratio 76.810% Loss Rate 46% Win Rate 54% Profit-Loss Ratio 1.02 Alpha 1.402 Beta -0.137 Annual Standard Deviation 0.39 Annual Variance 0.152 Information Ratio 1.127 Tracking Error 0.585 Treynor Ratio -9.594 Total Fees $4079.51 |
import json
import pandas as pd
class HorizontalOptimizedThrustAssembly(QCAlgorithm):
def Initialize(self):
self.odds_data = self.load_odds_data()
self.SetStartDate(2020, 3, 13) # Set Start Date
self.SetEndDate(self.odds_data.index.max().year, self.odds_data.index.max().month, self.odds_data.index.max().day)
self.SetCash(100000) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverseSelection(
FineFundamentalUniverseSelectionModel(self.SelectCoarse, self.SelectFine)
)
self.AddAlpha(BidenTrumpOddsAlpha(self))
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
def SelectCoarse(self, coarse):
filter_price = [c for c in coarse if c.Price > 5]
sorted_dollar_volume = sorted([c for c in filter_price if c.HasFundamentalData], key=lambda c: c.Volume, reverse=True)
return [c.Symbol for c in sorted_dollar_volume][:100]
def SelectFine(self, fine):
self.healthcare = [f for f in fine if f.AssetClassification.MorningstarSectorCode == MorningstarSectorCode.Healthcare]
self.high_eps = sorted([f for f in fine if f not in self.healthcare], key=lambda f: f.EarningReports.NormalizedBasicEPS.OneMonth, reverse=True)[:len(self.healthcare)]
return [*[f.Symbol for f in self.healthcare], *[f.Symbol for f in self.high_eps]]
def load_odds_data(self):
request = self.Download('https://www.realclearpolitics.com/json/odds/event_1_final.json?1595265370902')
biden = pd.DataFrame({date['date_r']: [float(c['value']) for c in date['candidates'] if c['id'] == '4'] for date in json.loads(request)['poll']['rcp_avg']}).T[0]
trump = pd.DataFrame({date['date_r']: [float(c['value']) for c in date['candidates'] if c['id'] == '1'] for date in json.loads(request)['poll']['rcp_avg']}).T[0]
df = pd.DataFrame()
df['Biden'] = biden
df['Trump'] = trump
df['Diff'] = biden - trump
df.index = pd.to_datetime(df.index, utc=True).shift(2, freq='d').map(lambda x: x.replace(hour=0, minute=0, second=0))
return df
class BidenTrumpOddsAlpha:
def __init__(self, algorithm):
self.algorithm = algorithm
self.lookback = 5
self.thresh = 0.1
def Update(self, algorithm, slice):
insights = []
today = self.algorithm.odds_data.loc[algorithm.Time, 'Diff']
previous = self.algorithm.odds_data.loc[algorithm.Time - timedelta(self.lookback), 'Diff']
pct_change = (today - previous) / previous
if abs(pct_change) > self.thresh:
healthcare_direction = InsightDirection.Up if pct_change > 0 else InsightDirection.Down
high_eps_direction = InsightDirection.Down if pct_change > 0 else InsightDirection.Up
for security in self.algorithm.healthcare:
insights.append(Insight.Price(security.Symbol, timedelta(self.lookback), healthcare_direction))
for security in self.algorithm.high_eps:
insights.append(Insight.Price(security.Symbol, timedelta(self.lookback), high_eps_direction))
return insights
def OnSecuritiesChanged(self, algorithm, changes):
pass