Overall Statistics
Total Orders
5321
Average Win
0.35%
Average Loss
-0.11%
Compounding Annual Return
46.760%
Drawdown
54.400%
Expectancy
2.075
Start Equity
100000
End Equity
43378066.9
Net Profit
43278.067%
Sharpe Ratio
0.986
Sortino Ratio
1.088
Probabilistic Sharpe Ratio
19.450%
Loss Rate
26%
Win Rate
74%
Profit-Loss Ratio
3.14
Alpha
0.112
Beta
2.221
Annual Standard Deviation
0.392
Annual Variance
0.154
Information Ratio
1.145
Tracking Error
0.229
Treynor Ratio
0.174
Total Fees
$94619.24
Estimated Strategy Capacity
$270000000.00
Lowest Capacity Asset
GLD T3SKPOF94JFP
Portfolio Turnover
1.13%
Drawdown Recovery
568
from AlgorithmImports import *

class EquityGoldRiskParity(QCAlgorithm):

    ASSETS = ["TQQQ", "GLD"]
    BENCHMARK_TICKER = "QQQ"
    LOOKBACK_PERIOD = 30
    WARMUP_PERIOD = LOOKBACK_PERIOD + 5

    def initialize(self):

        self._symbols = []

        self.universe_settings.leverage = 1.0
        self.universe_settings.resolution = Resolution.DAILY
        self.set_brokerage_model(BrokerageName.INTERACTIVE_BROKERS_BROKERAGE, AccountType.MARGIN)

        self.set_start_date(2010, 10, 2)

        for ticker in self.ASSETS:
            self._symbols.append(self.add_equity(ticker, resolution=Resolution.DAILY).symbol)

        self.set_warmup(self.WARMUP_PERIOD, resolution=Resolution.DAILY)
        self.set_benchmark(self.BENCHMARK_TICKER)

    def on_securities_changed(self, changes):
        for security in changes.added_securities:
            security.indicator = self.std(security.symbol, self.LOOKBACK_PERIOD, resolution=Resolution.DAILY)

    def on_data(self, data):
        if self.is_warming_up:
            return

        inverse_volatilities = {}

        for symbol in self._symbols:
            security = self.securities[symbol]
            if security.indicator.is_ready and security.indicator.current.value > 0:
                inverse_volatilities[symbol] = 1 / security.indicator.current.value

        if not inverse_volatilities:
            return
        
        total_inverse_volatility = sum(inverse_volatilities.values())

        portfolio_targets = [
            PortfolioTarget(symbol, inv_vol / total_inverse_volatility)
            for symbol, inv_vol in inverse_volatilities.items()
        ]
        self.set_holdings(portfolio_targets)