| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 7.502% Drawdown 1.200% Expectancy 0 Net Profit 0.079% Sharpe Ratio 0.638 Probabilistic Sharpe Ratio 0% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 1.409 Beta 2.107 Annual Standard Deviation 0.179 Annual Variance 0.032 Information Ratio 7.762 Tracking Error 0.094 Treynor Ratio 0.054 Total Fees $1.56 |
from QuantConnect.Securities.Option import OptionPriceModels
class ParticleMultidimensionalAntennaArray(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 6, 8) # Set Start Date
self.SetEndDate(2020, 6, 9)
self.SetCash(100000) # Set Strategy Cash
self.bond = self.AddEquity("SPY")
self.bond.SetDataNormalizationMode(DataNormalizationMode.Raw)
self.bondSymbol = self.bond.Symbol
self.bondOptionTargetDuration = TimeSpan.FromDays(8)
self.bondOption = self.AddOption(self.bondSymbol)
self.bondOption.SetFilter(0, 100, TimeSpan.FromDays(0), self.bondOptionTargetDuration)
self.bondOption.PriceModel = OptionPriceModels.BinomialCoxRossRubinstein()
self.bondOptionSymbol = self.bondOption.Symbol
self.sellCallsTime = self.Time + timedelta(hours = 10, minutes = 30)
self.SetWarmUp(timedelta(days=20))
def OnData(self, data):
if self.IsWarmingUp:
x = 1
return
if not self.Portfolio.Invested:
self.SetHoldings("SPY", 1)
if self.Time >= self.sellCallsTime:
x = self.SellBondOptions()
def GetBondCallOption(self, expirationDelta, targetDelta):
optionchain = None
y = len([x for x in self.CurrentSlice.OptionChains.Keys])
for kvp in self.CurrentSlice.OptionChains:
if kvp.Key != self.bondOptionSymbol: continue
optionchain = kvp.Value
if not optionchain: return None
optionchain = [x for x in optionchain if x.Right == OptionRight.Call]
optionchain = sorted(optionchain, key = lambda x: x.Expiry)
x = 1
return optionchain[0] if len(optionchain) > 0 else None
def OnOrderEvent(self, orderEvent):
order = self.Transactions.GetOrderById(orderEvent.OrderId)
if order.Type == OrderType.OptionExercise:
self.Debug(f"{self.Time} Bond exercise")
num = self.Portfolio.Cash // self.Securities[self.bondSymbol].AskPrice
self.Debug(f"{self.Time} on order event buy")
self.Buy(self.bondSymbol, num)
def SellBondOptions(self):
self.bondOption = self.GetBondCallOption(self.bondOptionTargetDuration, .2)
if not self.bondOption: return 0
num = self.Portfolio[self.bondSymbol].Quantity // 100
self.Debug(f"{self.Time} selling bond option for {self.bondOption.BidPrice * num * 100}")
self.Sell(self.bondOption.Symbol, num)
return 1