| Overall Statistics |
|
Total Trades 7 Average Win 7.93% Average Loss -6.28% Compounding Annual Return 10.284% Drawdown 13.300% Expectancy 0.131 Net Profit 3.436% Sharpe Ratio 0.392 Probabilistic Sharpe Ratio 32.678% Loss Rate 50% Win Rate 50% Profit-Loss Ratio 1.26 Alpha 0.13 Beta 0.156 Annual Standard Deviation 0.32 Annual Variance 0.103 Information Ratio 0.329 Tracking Error 0.478 Treynor Ratio 0.802 Total Fees $9.25 Estimated Strategy Capacity $16000000.00 Lowest Capacity Asset OG XETIJTADEO4G|GC XFO1EI4768PP |
from AlgorithmImports import *
class FutureOptionDataAlgorithm(QCAlgorithm):
option_contract_by_underlying_future_contract = {}
def Initialize(self):
self.SetStartDate(2020, 1, 28)
self.SetEndDate(2020, 6, 1)
self.SetCash(100000)
# Requesting data
gold_futures = self.AddFuture(Futures.Metals.Gold, Resolution.Minute)
gold_futures.SetFilter(0, 90)
self.AddFutureOption(gold_futures.Symbol, lambda universe: universe.Strikes(-5, +5)
.CallsOnly()
.BackMonth()
.OnlyApplyFilterAtMarketOpen())
def OnData(self, data):
for kvp in data.OptionChains:
# Liquidate underlying Future contract after Option assignment
underlying_future_contract = kvp.Key.Underlying
if self.Portfolio[underlying_future_contract].Invested:
self.Liquidate(underlying_future_contract)
self.option_contract_by_underlying_future_contract.pop(underlying_future_contract)
chain = kvp.Value
chain = [contract for contract in chain if self.Securities[contract.Symbol].IsTradable]
# Continue if chain is empty or already invested in an Option on this Futures contract
if not chain or underlying_future_contract in self.option_contract_by_underlying_future_contract:
continue
# Select the Option contract with the lowest strike price
contract = sorted(chain, key = lambda x: x.Strike)[0]
self.MarketOrder(contract.Symbol, 1)
self.option_contract_by_underlying_future_contract[kvp.Key.Underlying] = contract
def OnSecuritiesChanged(self, changes):
for security in changes.AddedSecurities:
if security.Type == SecurityType.FutureOption:
# Historical data
history = self.History(security.Symbol, 10, Resolution.Minute)
self.Debug(f"We got {len(history)} from our history request for {security.Symbol}")