Overall Statistics
Total Trades
1
Average Win
0%
Average Loss
0%
Compounding Annual Return
1.809%
Drawdown
3.700%
Expectancy
0
Net Profit
0.763%
Sharpe Ratio
0.319
Probabilistic Sharpe Ratio
29.799%
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0.014
Beta
-0.032
Annual Standard Deviation
0.042
Annual Variance
0.002
Information Ratio
0.196
Tracking Error
0.067
Treynor Ratio
-0.428
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
        
        
        
        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)