Overall Statistics
Total Orders
39700
Average Win
0.02%
Average Loss
-0.01%
Compounding Annual Return
17.894%
Drawdown
18.500%
Expectancy
0.394
Start Equity
1000000
End Equity
6108811.23
Net Profit
510.881%
Sharpe Ratio
0.834
Sortino Ratio
0.923
Probabilistic Sharpe Ratio
45.579%
Loss Rate
42%
Win Rate
58%
Profit-Loss Ratio
1.39
Alpha
0.057
Beta
0.605
Annual Standard Deviation
0.125
Annual Variance
0.016
Information Ratio
0.241
Tracking Error
0.105
Treynor Ratio
0.172
Total Fees
$63283.74
Estimated Strategy Capacity
$7300000.00
Lowest Capacity Asset
SPY R735QTJ8XC9X
Portfolio Turnover
15.14%
Drawdown Recovery
306
#region imports
from AlgorithmImports import *
#endregion

from Risk.TrailingStopRiskManagementModel import TrailingStopRiskManagementModel
from Execution.StandardDeviationExecutionModel import StandardDeviationExecutionModel

class SPY_PLUS(QCAlgorithm):

    def Initialize(self):
        self.SetStartDate(2015, 1, 1)
        self.SetCash(1_000_000)

        self.SetRiskManagement(TrailingStopRiskManagementModel(0.03250))
        self.SetExecution(StandardDeviationExecutionModel(50, 0.95, Resolution.Minute))

        self.indicatorPeriod = 120
        self.resolution = Resolution.Minute

        self.spy = self.AddEquity("SPY", self.resolution).Symbol
        self.sh = self.AddEquity("SH", self.resolution).Symbol
        self.uvxy = self.AddEquity("UVXY", self.resolution).Symbol

        self.std = self.STD(self.spy, self.indicatorPeriod, self.resolution)

        self.SetWarmUp(self.indicatorPeriod, self.resolution)

        self.Schedule.On(self.DateRules.EveryDay(self.spy),self.TimeRules.AfterMarketOpen(self.spy, 5),self.Rebalance)

    def Rebalance(self):
        if self.IsWarmingUp or not self.std.IsReady:
            return

        if self.std.Current.Value < 2.6:
            self.SetHoldings(self.sh, 0)
            self.SetHoldings(self.spy, 1.0)
            self.SetHoldings(self.uvxy, 0.00)
        else:
            self.SetHoldings(self.spy, 0)
            self.SetHoldings(self.sh, 0.95)
            self.SetHoldings(self.uvxy, 0.05)

    def OnData(self, data: Slice):
        pass