Overall Statistics
Total Orders
170
Average Win
0.27%
Average Loss
-0.03%
Compounding Annual Return
6.826%
Drawdown
17.200%
Expectancy
9.925
Start Equity
100000
End Equity
148609.33
Net Profit
48.609%
Sharpe Ratio
0.451
Sortino Ratio
0.451
Probabilistic Sharpe Ratio
15.549%
Loss Rate
1%
Win Rate
99%
Profit-Loss Ratio
10.06
Alpha
0.007
Beta
0.359
Annual Standard Deviation
0.075
Annual Variance
0.006
Information Ratio
-0.364
Tracking Error
0.115
Treynor Ratio
0.094
Total Fees
$172.13
Estimated Strategy Capacity
$6200000.00
Lowest Capacity Asset
BND TRO5ZARLX6JP
Portfolio Turnover
0.11%
Drawdown Recovery
386
# region imports
from AlgorithmImports import *
# endregion


class StockBondAllocationAlgorithm(QCAlgorithm):
    """
    Static allocation between equities and bonds.
    """

    def initialize(self):
        # keep in mind data snooping bias:
        # always leave some (typically more recent) time period for testing!
        self.set_start_date(2017, 1, 1)
        self.set_end_date(2022, 12, 31)
        
        # key settings
        tickers = ['SPY', 'GLD', 'BND']
        
        self.settings.daily_precise_end_time = False
        
        self._equities = [self.add_equity(ticker).symbol for ticker in tickers]
        self.schedule.on(self.date_rules.month_start(self._equities[0]), self.time_rules.after_market_open(self._equities[0], 1), self.rebalance)
    

    def rebalance(self):
        weight = 1.0 / len(self._equities)
        for symbol in self._equities:
            self.set_holdings(symbol, weight)