| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 0.255% Drawdown 3.700% Expectancy 0 Net Profit 0.108% Sharpe Ratio 0.063 Probabilistic Sharpe Ratio 23.339% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.002 Beta -0.028 Annual Standard Deviation 0.043 Annual Variance 0.002 Information Ratio 0.192 Tracking Error 0.068 Treynor Ratio -0.098 Total Fees $0.00 Estimated Strategy Capacity $590000.00 Lowest Capacity Asset EURUSD 8G |
import numpy as np
from scipy import sparse
from scipy.sparse.linalg import spsolve
import numpy as np
class TrendFollowingAlgorithm(QCAlgorithm):
def Initialize(self):
# Set Date Range (Frame 1)
# self.SetStartDate(2016, 1, 1)
# self.SetEndDate(2020, 12, 31)
# Set Date Range (Frame 2)
# self.SetStartDate(2011, 1, 1)
# self.SetEndDate(2015, 12, 31)
# Set Date Range (Frame 3)
# self.SetStartDate(2006, 1, 1)
# self.SetEndDate(2010, 12, 31)
# Set Date Range (Frame 4)
# self.SetStartDate(2001, 1, 1)
# self.SetEndDate(2005, 12, 31)
# self.SetCash(100000)
self.SetStartDate(2021, 1, 1)
self.SetEndDate(2021, 6, 4)
# self.SetCash(10340) # Set Strategy Cash lowhigh
self.SetCash(21290) # Set Strategy Cash low
self.numdays = 360*5 # set the length of training period
self.syl = self.AddSecurity(SecurityType.Forex, "EURUSD", Resolution.Daily).Symbol
self.n,self.m = 2, 1
self.trend = None
self.SetBenchmark(self.syl)
self.MA_rules = None
history = self.History(self.numdays,Resolution.Daily)
self.close = [slice[self.syl].Close for slice in history]
def hpfilter(self,X, lamb=1600):
X = np.asarray(X, float)
if X.ndim > 1:
X = X.squeeze()
nobs = len(X)
I = sparse.eye(nobs,nobs)
offsets = np.array([0,1,2])
data = np.repeat([[1.],[-2.],[1.]], nobs, axis=1)
K = sparse.dia_matrix((data, offsets), shape=(nobs-2,nobs))
use_umfpack = True
self.trend = spsolve(I+lamb*K.T.dot(K), X, use_umfpack=use_umfpack)
self.cycle = X - self.trend
def OnData(self,data):
self.close.append(self.Portfolio[self.syl].Price)
self.hpfilter(self.close[-self.numdays:len(self.close)+1], 100)
self.MA_rules_today = (np.mean(self.trend[-self.m : len(self.trend)]) - np.mean(self.trend[-self.n : len(self.trend)]))
self.MA_rules_yesterday = (np.mean(self.trend[-self.m-1: len(self.trend)-1]) - np.mean(self.trend[-self.n-1 : len(self.trend)-1]))
holdings = self.Portfolio[self.syl].Quantity
if self.MA_rules_today > 0 and self.MA_rules_yesterday < 0:
self.SetHoldings(self.syl, 1)
elif self.MA_rules_today < 0 and self.MA_rules_yesterday > 0:
self.SetHoldings(self.syl, -1)