Overall Statistics
Total Orders
997
Average Win
2.79%
Average Loss
-1.86%
Compounding Annual Return
31.295%
Drawdown
90.700%
Expectancy
0.294
Start Equity
100000.00
End Equity
884228.81
Net Profit
784.229%
Sharpe Ratio
1.018
Sortino Ratio
1.412
Probabilistic Sharpe Ratio
23.984%
Loss Rate
48%
Win Rate
52%
Profit-Loss Ratio
1.50
Alpha
-0.233
Beta
0.938
Annual Standard Deviation
0.853
Annual Variance
0.728
Information Ratio
-0.588
Tracking Error
0.519
Treynor Ratio
0.925
Total Fees
$235885.11
Estimated Strategy Capacity
$1600000.00
Lowest Capacity Asset
JASMYUSD 2XR
Portfolio Turnover
1.53%
# 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.set_brokerage_model(BrokerageName.COINBASE, AccountType.CASH)
        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.95/len(symbols)) for s in symbols], True)