| Overall Statistics |
|
Total Trades 2 Average Win 0% Average Loss 0% Compounding Annual Return -75.892% Drawdown 3.900% Expectancy 0 Net Profit -3.070% Sharpe Ratio -4.907 Probabilistic Sharpe Ratio 12.035% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha -0.371 Beta 0.446 Annual Standard Deviation 0.161 Annual Variance 0.026 Information Ratio 0.778 Tracking Error 0.192 Treynor Ratio -1.772 Total Fees $2.00 |
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from scipy.stats import linregress
import decimal as d
class MyFrameworkAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 9, 1) # Set Start Date
self.SetCash(10000) # Set Strategy Cash
#self.SetEndDate(2018, 1, 1)
# create a dictionary to store momentum indicators for all symbols
self.back_period = 21 # months
self.vol_period = 21 # days for calc vol
self.x = np.asarray(range(self.vol_period))
self.Log(self.x)
self.ematwenty = {}
#Warmup period
period = 200
#MOM period
period1 = 20
self.SetRiskManagement(TrailingStopRiskManagementModel(0.20))
# warm up the MOM indicator
self.SetWarmUp(period)
self.symbols = []
self.tickers = ["SPY",
"TLT"]
for ticker in self.tickers:
symbol = self.AddEquity(ticker, Resolution.Hour).Symbol
self.symbols.append(symbol)
self.ematwenty[symbol] = self.EMA(symbol, 91, Resolution.Hour)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Wednesday), \
self.TimeRules.At(10, 31), \
self.Rebalance)
######################################
def rsquared(self, x, y):
# slope, intercept, r_value, p_value, std_err
_, _, r_value, _, _ = linregress(x, y)
return r_value**2
######################################
def Rebalance(self):
if self.IsWarmingUp: return
allPrices = self.History(self.symbols, self.back_period, Resolution.Daily).close.unstack(level=0)
Alldata = pd.DataFrame(allPrices[symbol] for symbol in self.symbols)
arr = Alldata.to_numpy()
rsq = np.apply_along_axis(self.rsquared, 1, arr, self.x)
Enterdata = pd.DataFrame(list(zip(self.tickers)), columns =['tickers'])
Enterdata.insert(1, "Price", [self.Portfolio[symbol].Price for symbol in self.symbols], True)
Enterdata.insert(2, "ema", [self.ematwenty[symbol].Current.Value for symbol in self.symbols], True)
Enterdata['rsq'] = rsq
self.Log(Enterdata)
ema20 = Enterdata[Enterdata['Price'] > Enterdata['ema']]
top3 = ema20.sort_values(by='rsq', ascending = False)[:3]
top3_symbols = [self.symbols[i] for i in top3.index]
for kvp in self.Portfolio:
security_hold = kvp.Value
if security_hold.Invested and (security_hold.Symbol not in top3_symbols):
self.Liquidate(security_hold.Symbol)
added_symbols = []
for symbol in top3_symbols:
if not self.Portfolio[symbol].Invested:
added_symbols.append(symbol)
for added in added_symbols:
self.SetHoldings(added, 1.0/len(added_symbols))
self.Log(added_symbols)
return