Overall Statistics
Total Trades
678
Average Win
1.48%
Average Loss
-2.48%
Compounding Annual Return
53.574%
Drawdown
57.400%
Expectancy
0.271
Net Profit
226.915%
Sharpe Ratio
1.069
Probabilistic Sharpe Ratio
39.545%
Loss Rate
21%
Win Rate
79%
Profit-Loss Ratio
0.60
Alpha
0.466
Beta
0.474
Annual Standard Deviation
0.466
Annual Variance
0.217
Information Ratio
0.92
Tracking Error
0.468
Treynor Ratio
1.05
Total Fees
$0.00
Estimated Strategy Capacity
$7000000.00
Lowest Capacity Asset
BTCUSD XJ
#region imports
from AlgorithmImports import *
#endregion
# Trading Kalman Filter

# https://www.quantconnect.com/project/9975790

from pykalman import KalmanFilter
import numpy as np

# ----------------------------------------
CRYPTO = 'BTCUSD'; PERIOD = 42; LEV = 1.0;
# ----------------------------------------

class EnergeticFluorescentOrangeElephant(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2020, 1, 1)
        # self.SetEndDate(2021, 11, 1)
        self.crypto = self.AddCrypto(CRYPTO, Resolution.Daily).Symbol
        self.rollingWindow = RollingWindow[TradeBar](PERIOD)
        self.Consolidate(self.crypto, Resolution.Daily, self.CustomBarHandler)
        self.SetWarmUp(5*PERIOD, Resolution.Daily)  
                 

    def OnData(self, data):
        if not self.rollingWindow.IsReady: return
    
        L = np.flipud(np.array([self.rollingWindow[i].Low for i in range(PERIOD)]))
        
        self.kf = KalmanFilter(transition_matrices = [1],
                 observation_matrices = [1],
                 initial_state_mean = 0,
                 initial_state_covariance = 1,
                 observation_covariance=1,
                 transition_covariance=.01)
                 
        price = self.Securities[self.crypto].Price
        kf_l,_ = self.kf.filter(L)
        
        self.Plot(self.crypto, "Price", price)        
        self.Plot(self.crypto, "Kalman L", kf_l[-1])
        
        if price >= kf_l[-1]:
            self.SetHoldings(self.crypto, LEV)
        elif price < kf_l[-1]:
            self.SetHoldings(self.crypto, 0) 
        
        
    def CustomBarHandler(self, bar):
        self.rollingWindow.Add(bar)