| Overall Statistics |
|
Total Trades 4 Average Win 0% Average Loss -0.92% Compounding Annual Return 96.758% Drawdown 1.300% Expectancy -1 Net Profit 5.264% Sharpe Ratio 5.383 Probabilistic Sharpe Ratio 96.479% Loss Rate 100% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.582 Beta 0.426 Annual Standard Deviation 0.116 Annual Variance 0.013 Information Ratio 4.437 Tracking Error 0.118 Treynor Ratio 1.465 Total Fees $2.00 Estimated Strategy Capacity $150000.00 Lowest Capacity Asset GOOCV WJVVXYW5VKH2|GOOCV VP83T1ZUHROL Portfolio Turnover 3.08% |
# region imports
from AlgorithmImports import *
# endregion
class LongStrangleAlgorithm(QCAlgorithm):
def Initialize(self) -> None:
self.SetStartDate(2017, 4, 1)
self.SetEndDate(2017, 4, 30)
self.SetCash(100000)
option = self.AddOption("GOOG")
self.symbol = option.Symbol
option.SetFilter(-5, 5, 0, 30)
def OnData(self, slice: Slice) -> None:
if self.Portfolio.Invested:
return
# Get the OptionChain
chain = slice.OptionChains.get(self.symbol)
if not chain:
return
# Find options with the nearest expiry
expiry = max([x.Expiry for x in chain])
contracts = [contract for contract in chain if contract.Expiry == expiry]
# Order the OTM calls by strike to find the nearest to ATM
call_contracts = sorted([contract for contract in contracts
if contract.Right == OptionRight.Call and
contract.Strike > chain.Underlying.Price],
key=lambda x: x.Strike)
if not call_contracts:
return
# Order the OTM puts by strike to find the nearest to ATM
put_contracts = sorted([contract for contract in contracts
if contract.Right == OptionRight.Put and
contract.Strike < chain.Underlying.Price],
key=lambda x: x.Strike, reverse=True)
if not put_contracts:
return
call_strike = call_contracts[0].Strike
put_strike = put_contracts[0].Strike
long_strangle = OptionStrategies.Strangle(self.symbol, call_strike, put_strike, expiry)
self.Buy(long_strangle, 1)