Created with Highcharts 12.1.2EquityJul 2017Jan 2018Jul 2018Jan 2019Jul 2019Jan 2020Jul 2020Jan 2021Jul 2021Jan 2022Jul 2022Jan 2023Jul 2023Jan 2024Jul 2024Jan 2025Jul 202502.5M-100000.20102.5M5M02.5M5M05001020
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)