Overall Statistics
Total Orders
269
Average Win
0.57%
Average Loss
-0.68%
Compounding Annual Return
0.689%
Drawdown
11.300%
Expectancy
0.044
Start Equity
1000000
End Equity
1061023
Net Profit
6.102%
Sharpe Ratio
-0.542
Sortino Ratio
-0.521
Probabilistic Sharpe Ratio
0.159%
Loss Rate
43%
Win Rate
57%
Profit-Loss Ratio
0.83
Alpha
-0.014
Beta
-0.04
Annual Standard Deviation
0.031
Annual Variance
0.001
Information Ratio
-0.63
Tracking Error
0.159
Treynor Ratio
0.421
Total Fees
$0.00
Estimated Strategy Capacity
$69000000.00
Lowest Capacity Asset
SPX 32K4X0ZMMZAMM|SPX 31
Portfolio Turnover
0.03%
# region imports
from AlgorithmImports import *
# endregion


class VolatilityTradingOptionAlgorithm(QCAlgorithm):

    def initialize(self):
        self.set_start_date(2016, 1, 1)
        self.set_cash(1_000_000)
        self._vix = self.add_index('VIX')
        self.settings.automatic_indicator_warm_up = True
        self._bb = self.bb(self._vix.symbol, 90, 1, resolution=Resolution.DAILY)
        self._spx = self.add_index_option('SPX')
        self._spx.set_filter(lambda universe: universe.straddle(30))

    def on_data(self, data):
        if self.portfolio.invested: return
        chain = data.option_chains.get(self._spx.symbol, None)
        if not chain: return
        expiry = min([x.expiry for x in chain if x.expiry > self.time])
        strike = sorted(chain, key=lambda x: abs(x.strike - chain.underlying.price))[0].strike
        strategy = OptionStrategies.straddle(self._spx.symbol, strike, expiry)
        quantity = 1 if self._vix.price > self._bb.upper_band.current.value else -1
        self.plot('VIX', 'Value', self._vix.price)
        self.plot('VIX', '+1 STD', self._bb.upper_band.current.value)
        self.order(strategy, quantity)

    def on_order_event(self, order_event):
        if order_event.status == OrderStatus.FILLED and order_event.is_assignment:
            self.liquidate()