| Overall Statistics |
|
Total Orders 960 Average Win 2.64% Average Loss -1.65% Compounding Annual Return 42.848% Drawdown 88.300% Expectancy 0.413 Start Equity 100000 End Equity 1736777.78 Net Profit 1636.778% Sharpe Ratio 0.853 Sortino Ratio 1.167 Probabilistic Sharpe Ratio 16.152% Loss Rate 46% Win Rate 54% Profit-Loss Ratio 1.60 Alpha 0.454 Beta 1.114 Annual Standard Deviation 0.638 Annual Variance 0.407 Information Ratio 0.753 Tracking Error 0.615 Treynor Ratio 0.489 Total Fees $0.00 Estimated Strategy Capacity $1600000.00 Lowest Capacity Asset JASMYUSD 2XR Portfolio Turnover 1.33% |
# 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.schedule.on(date_rule, self.time_rules.midnight, self._rebalance)
self._universe = self.add_universe(CryptoUniverse.coinbase(self._select_assets))
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
inv_return_volatility = 1/self.history(symbols, 365, Resolution.DAILY).close.unstack(0).pct_change()[1:].std()
inverse_sum = inv_return_volatility.sum()
self.set_holdings([PortfolioTarget(s, 0.9*(inv_vol/inverse_sum)) for s, inv_vol in inv_return_volatility.items()], True)