| Overall Statistics |
|
Total Trades 112 Average Win 2.48% Average Loss -2.03% Compounding Annual Return 9.725% Drawdown 32.700% Expectancy 0.095 Net Profit 7.292% Sharpe Ratio 0.426 Probabilistic Sharpe Ratio 25.391% Loss Rate 51% Win Rate 49% Profit-Loss Ratio 1.22 Alpha 0.274 Beta 0.077 Annual Standard Deviation 0.559 Annual Variance 0.313 Information Ratio 0.926 Tracking Error 0.768 Treynor Ratio 3.101 Total Fees BUSD3395.73 Estimated Strategy Capacity BUSD48000000000.00 Lowest Capacity Asset FTMBUSD 18N |
# region imports
from AlgorithmImports import *
# endregion
class FocusedBrownJaguar(QCAlgorithm):
def Initialize(self):
# *** initial configurations and backtest ***
self.SetStartDate(2022, 1, 1) # Set Start Date
self.SetEndDate(2022, 10, 2) # Set Start Date
self.SetSecurityInitializer(self.CustomSecurityInitializer)
self.SetAccountCurrency("BUSD") # Set Account Currency
self.SetCash("BUSD", 100000, 1) # Set Strategy Cash
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(CryptoCoarseFundamentalUniverse(Market.Binance, self.UniverseSettings, self.universe_filter))
# self.Settings.RebalancePortfolioOnInsightChanges = False
self.Settings.RebalancePortfolioOnSecurityChanges = False
# *** Universe Selection parameters ***
self.minimumVolume = 10000000 # minimumVolume for coin selection
self.minimumCoinPriceInUSD = 1
self.maximumCoinPriceInUSD = 25
# Maximum number of coins to be selected in coarse universe selection
self.maxNumCoarse = 50
self.portfolioTargets = []
self.SetBenchmark(Symbol.Create("BTCUSDC", SecurityType.Crypto, Market.Binance))
# *** Framework initialization ***
self.AddAlpha(EmaCrossAlphaModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel(lambda time: None))
self.AddRiskManagement(NullRiskManagementModel())
self.SetExecution(ImmediateExecutionModel())
# *** Brokerage settings
self.SetBrokerageModel(BrokerageName.Binance, AccountType.Margin)
self.order_properties = BinanceOrderProperties()
# *** Aux properties ***
self.month = 0
self.filterCount = 0
def OnData(self, data):
pass
def IsRebalanceDue(self, time):
pass
def OnSecuritiesChanged(self, changes: SecurityChanges) -> None:
pass
def CustomSecurityInitializer(self, security):
security.SetFeeModel(BinanceFeeModel())
security.SetFillModel(ImmediateFillModel())
security.SetBuyingPowerModel(SecurityMarginModel(1))
def universe_filter(self, crypto_coarse: List[CryptoCoarseFundamental]) -> List[Symbol]:
# trying to filter universe only once
if self.filterCount == 0:
# randomly selecting small crypto Coins on USD
coarseCoins = [ccf for ccf in crypto_coarse if ccf.Symbol.Value[-3:] == "USD" and ccf.Symbol.Value[:2] != "US" and ccf.Volume >= self.minimumVolume and ccf.Price >= self.minimumCoinPriceInUSD and ccf.Price <= self.maximumCoinPriceInUSD]
selected = sorted([x for x in coarseCoins], key = lambda x: x.Volume, reverse = True)
numSelected = min(len(selected),self.maxNumCoarse)
self.filterCount = 1
return [x.Symbol for x in selected[:numSelected]]
else:
return Universe.Unchanged