| Overall Statistics |
|
Total Trades 20938 Average Win 0.02% Average Loss -0.01% Compounding Annual Return -2.004% Drawdown 15.300% Expectancy -0.072 Net Profit -11.097% Sharpe Ratio -0.43 Probabilistic Sharpe Ratio 0.008% Loss Rate 63% Win Rate 37% Profit-Loss Ratio 1.49 Alpha -0.016 Beta 0 Annual Standard Deviation 0.037 Annual Variance 0.001 Information Ratio -0.857 Tracking Error 0.125 Treynor Ratio 38.678 Total Fees $46327.07 |
from QuantConnect.Data.Custom.TradingEconomics import *
class AlphaFiveUSTreasuries(QCAlgorithm):
def Initialize(self):
#1. Required: Five years of backtest history
self.SetStartDate(2014, 1, 1)
#2. Required: Alpha Streams Models:
self.SetBrokerageModel(BrokerageName.AlphaStreams)
#3. Required: Significant AUM Capacity
self.SetCash(1000000)
#4. Required: Benchmark to SPY
self.SetBenchmark("SPY")
#5. Use InsightWeightingPCM since we will compute the weights
self.SetPortfolioConstruction(InsightWeightingPortfolioConstructionModel())
self.SetExecution(ImmediateExecutionModel())
# Add TradingEconomicsCalendar for Energy Data
us = TradingEconomics.Calendar.UnitedStates
self.nat = self.AddData(TradingEconomicsCalendar, us.NaturalGasStocksChange).Symbol
self.oli = self.AddData(TradingEconomicsCalendar, us.ApiCrudeOilStockChange).Symbol
self.gas = self.AddData(TradingEconomicsCalendar, us.GasolineStocksChange).Symbol
# Energy Basket
tickers = ["XLE", "IYE", "VDE", "USO", "XES", "XOP",
"UNG", "ICLN", "ERX", "ERY", "SCO", "UCO",
"AMJ", "BNO", "AMLP", "OIH", "DGAZ", "UGAZ", "TAN"]
# Add Equity ----------------------------------------------
self.symbols = [self.AddEquity(x).Symbol for x in tickers]
self.factor = 0
# Emit insights 10 minutes after market open to
# try to ensure all price data is from the current day
self.Schedule.On(self.DateRules.EveryDay("XLE"),
self.TimeRules.AfterMarketOpen("XLE", 10),
self.EveryDayAfterMarketOpen)
def EveryDayAfterMarketOpen(self):
if self.factor == 0:
return
# The weight is factor normialized by the number of symbols
weight = self.factor / len(self.symbols)
self.factor = 0
# Emit Up Price insight
self.EmitInsights([
Insight.Price(x, timedelta(15), InsightDirection.Up, None, None, None, weight)
for x in self.symbols])
def OnData(self, data):
# Discard updates before 10 to avoid EveryDayAfterMarketOpen running with today's data
if self.Time.hour < 10:
return
# Compute the factor based on the Actual vs Forecast values
for kvp in data.Get(TradingEconomicsCalendar):
calendar = kvp.Value
actual = calendar.Actual
# The reference will be the Forecast, but if not available, use the Previous
reference = calendar.Forecast
if reference is None or reference == 0:
reference = calendar.Previous
if reference is None or reference == 0:
reference = actual
# Actual was worse than the reference.
# Bad. Reduce all positions to a minimum
if actual < reference:
self.factor = 0.1
continue
self.factor = max(0.1, min(1, 1 - actual / reference))