Overall Statistics |
Total Trades 19 Average Win 125.27% Average Loss -7.53% Compounding Annual Return 257.396% Drawdown 29.400% Expectancy 6.840 Net Profit 942.522% Sharpe Ratio 3.427 Probabilistic Sharpe Ratio 94.916% Loss Rate 56% Win Rate 44% Profit-Loss Ratio 16.64 Alpha 0.822 Beta 0.523 Annual Standard Deviation 0.507 Annual Variance 0.257 Information Ratio -0.03 Tracking Error 0.489 Treynor Ratio 3.324 Total Fees $418757.05 Estimated Strategy Capacity $12000000.00 Lowest Capacity Asset BTCUSD XJ |
# Simone Pantaleoni btcusd kalman-mom strategy from pykalman import KalmanFilter import numpy as np # --------------------------------------------------------------------------- CRYPTO = 'BTCUSD'; PERIOD = 30; MOM_F = 3; MOM_M = 30; MOM_S = 60; LEV = 1.0; # --------------------------------------------------------------------------- class BollingerBreakoutAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2020, 1, 1) self.SetEndDate(2021, 11, 1) self.SetCash(1000000) self.SetBrokerageModel(BrokerageName.GDAX, AccountType.Cash) self.crypto = self.AddCrypto(CRYPTO, Resolution.Daily).Symbol self.rollingWindow = RollingWindow[TradeBar](PERIOD) self.Consolidate(self.crypto, Resolution.Daily, self.CustomBarHandler) self.SetWarmUp(1*PERIOD, Resolution.Daily) self.mom_fast = self.MOMP(self.crypto, MOM_F, Resolution.Daily) self.mom_mid = self.MOMP(self.crypto, MOM_M, Resolution.Daily) self.mom_slow = self.MOMP(self.crypto, MOM_S, Resolution.Daily) def CustomBarHandler(self, bar): self.rollingWindow.Add(bar) 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) kf,_ = self.kf.filter(L) price = self.Securities[self.crypto].Close mom_fast = self.mom_fast.Current.Value mom_mid = self.mom_mid.Current.Value mom_slow = self.mom_slow.Current.Value mom_comb = float(mom_slow + mom_mid + 2 * mom_fast) self.Plot(self.crypto, "Price", self.Securities[self.crypto].Price) self.Plot(self.crypto, "Kalman", kf[-1]) self.Plot("Momentum", "mom_comb", mom_comb) self.Plot("Momentum", "zero", 0) holdings = self.Portfolio[self.crypto].Quantity if holdings <= 0: if price >= kf[-1] and mom_comb >= 0: self.SetHoldings(self.crypto, 1.0) elif holdings >= 0: if price < kf[-1] and mom_comb < 0: self.Liquidate()