| Overall Statistics |
|
Total Orders 961 Average Win 2.70% Average Loss -1.85% Compounding Annual Return 37.080% Drawdown 89.100% Expectancy 0.338 Start Equity 100000 End Equity 1248751.72 Net Profit 1148.752% Sharpe Ratio 0.794 Sortino Ratio 1.104 Probabilistic Sharpe Ratio 12.588% Loss Rate 46% Win Rate 54% Profit-Loss Ratio 1.47 Alpha 0.439 Beta 1.149 Annual Standard Deviation 0.67 Annual Variance 0.449 Information Ratio 0.697 Tracking Error 0.647 Treynor Ratio 0.463 Total Fees $0.00 Estimated Strategy Capacity $1400000.00 Lowest Capacity Asset JASMYUSD 2XR Portfolio Turnover 1.45% |
# region imports
from AlgorithmImports import *
# endregion
class StrategicCryptoReserveAlgorithm(QCAlgorithm):
def initialize(self) -> None:
self.set_end_date(2025, 3, 1)
self.set_start_date(self.end_date - timedelta(8*365))
self._market_pairs = [
x.key.symbol
for x in self.symbol_properties_database.get_symbol_properties_list(Market.COINBASE)
if (x.value.quote_currency == self.account_currency and # Account currency is USD
x.value.market_ticker.split('-')[0] not in ['USDT', 'USDC']) # Remove stable coins
]
self.time_rules.set_default_time_zone(TimeZones.UTC)
date_rule = self.date_rules.month_start()
self.universe_settings.schedule.on(date_rule)
self.universe_settings.resolution = Resolution.DAILY
self._universe = self.add_universe(CryptoUniverse.coinbase(self._select_assets))
self.schedule.on(date_rule, self.time_rules.midnight, self._rebalance)
def _select_assets(self, data):
selected = [c for c in data if str(c.symbol.id).split()[0] in self._market_pairs]
selected = [c.symbol for c in sorted(selected, key=lambda c: c.volume_in_usd)[-10:]]
self.plot('Universe', 'Size', len(selected))
return selected
def _rebalance(self):
symbols = self._universe.selected
if not symbols:
return
self.set_holdings([PortfolioTarget(s, 0.9/len(symbols)) for s in symbols], True)