Overall Statistics
Total Orders
3856
Average Win
0.17%
Average Loss
-0.16%
Compounding Annual Return
7.149%
Drawdown
30.300%
Expectancy
0.433
Net Profit
246.745%
Sharpe Ratio
0.378
Sortino Ratio
0.416
Probabilistic Sharpe Ratio
1.490%
Loss Rate
31%
Win Rate
69%
Profit-Loss Ratio
1.07
Alpha
0.01
Beta
0.451
Annual Standard Deviation
0.091
Annual Variance
0.008
Information Ratio
-0.191
Tracking Error
0.104
Treynor Ratio
0.076
Total Fees
$4484.21
Estimated Strategy Capacity
$83000000.00
Lowest Capacity Asset
TLT SGNKIKYGE9NP
Portfolio Turnover
2.51%
from AlgorithmImports import *

class DynamicAssetAllocationWithVIXAlgorithm(QCAlgorithm):
    def Initialize(self):
        self.SetStartDate(2005, 1, 1)  # Set Start Date
        self.SetEndDate(2023, 1, 1)    # Set End Date
        self.SetCash(100000)           # Set Strategy Cash
        
        # Adding Equity and VIX
        self.spy = self.AddEquity("SPY", Resolution.Daily).Symbol
        self.tlt = self.AddEquity("TLT", Resolution.Daily).Symbol
        self.vix = self.AddData(CBOE, "VIX", Resolution.Daily).Symbol
        
        # VIX Thresholds for allocation
        self.vix_threshold_low = 15
        self.vix_threshold_high = 30
        
        self.Schedule.On(self.DateRules.EveryDay(self.spy), self.TimeRules.AfterMarketOpen(self.spy, 30), self.RebalancePortfolio)

    def RebalancePortfolio(self):
        # Get the current VIX value
        vix_value = self.Securities[self.vix].Price
        
        # Log the current VIX value
        self.Log(f"Current VIX: {vix_value}")
        
        # Adjust allocations based on VIX value
        if vix_value > self.vix_threshold_high:
            # High VIX, perceived higher risk, increase TLT allocation
            self.SetHoldings(self.spy, 0.4)
            self.SetHoldings(self.tlt, 0.6)
        elif vix_value < self.vix_threshold_low:
            # Low VIX, perceived lower risk, increase SPY allocation
            self.SetHoldings(self.spy, 0.9)
            self.SetHoldings(self.tlt, 0.1)
        else:
            # Moderate VIX, balanced allocation
            self.SetHoldings(self.spy, 0.7)
            self.SetHoldings(self.tlt, 0.3)