| Overall Statistics |
|
Total Trades 3564 Average Win 0.20% Average Loss -0.17% Compounding Annual Return 72.131% Drawdown 24.200% Expectancy 0.217 Net Profit 75.243% Sharpe Ratio 1.356 Probabilistic Sharpe Ratio 65.647% Loss Rate 45% Win Rate 55% Profit-Loss Ratio 1.22 Alpha 0.515 Beta -0.001 Annual Standard Deviation 0.38 Annual Variance 0.144 Information Ratio 0.953 Tracking Error 0.405 Treynor Ratio -528.632 Total Fees $68056.69 |
import pandas as pd
# Import our custom functions
from StationarityAndZScores import *
# Import the Liquid ETF Universe helper methods
from QuantConnect.Data.UniverseSelection import *
class NadionParticleAntennaArray(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2018, 11, 1) # Set Start Date
self.SetCash(1000000) # Set Strategy Cash
self.SetBrokerageModel(AlphaStreamsBrokerageModel())
self.SetBenchmark('SPY')
self.SetExecution(ImmediateExecutionModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.UniverseSettings.Resolution = Resolution.Minute
self.SetUniverseSelection(LiquidETFUniverse())
self.AddEquity('XLE')
self.Schedule.On(self.DateRules.EveryDay('XLE'), self.TimeRules.AfterMarketOpen('XLE', 5), self.TransformTestTrade)
def TransformTestTrade(self):
qb = self
symbols = [x.Symbol for x in qb.ActiveSecurities.Values]
# Copy and paste from research notebook
# -----------------------------------------------------------------------------
# Fetch history and returns
history = qb.History(symbols, 500, Resolution.Hour)
returns = history.unstack(level = 1).close.transpose().pct_change().dropna()
# Test for stationarity
stationarity = TestStationartiy(returns)
# Get z-scores
z_scores = GetZScores(returns)
# -----------------------------------------------------------------------------
insights = []
# Iterate over symbols
for symbol, value in stationarity.iteritems():
# Only emit Insights for those whose returns exhibit stationary behavior
if value:
# Get most recent z_score
z_score = z_scores[symbol].tail(1).values[0]
if z_score < -1:
insights.append(Insight.Price(symbol, timedelta(1), InsightDirection.Up))
elif z_score > 1:
if self.Portfolio[symbol].Invested:
insights.append(Insight.Price(symbol, timedelta(1), InsightDirection.Flat))
self.EmitInsights(insights)import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
def TestStationartiy(returns):
# Return pandas Series with True/False for each symbol
return pd.Series([adfuller(values)[1] < 0.05 for columns, values in returns.iteritems()], index = returns.columns)
def GetZScores(returns):
# Return pandas DataFrame containing z-scores
return returns.subtract(returns.mean()).div(returns.std())