| 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)