Overall Statistics |
Total Orders 6 Average Win 12.04% Average Loss -5.94% Compounding Annual Return 35.514% Drawdown 17.800% Expectancy 1.018 Start Equity 100000 End Equity 111030.12 Net Profit 11.030% Sharpe Ratio 0.799 Sortino Ratio 1.109 Probabilistic Sharpe Ratio 41.658% Loss Rate 33% Win Rate 67% Profit-Loss Ratio 2.03 Alpha 0.343 Beta 0.132 Annual Standard Deviation 0.423 Annual Variance 0.179 Information Ratio 0.678 Tracking Error 0.56 Treynor Ratio 2.55 Total Fees $7.41 Estimated Strategy Capacity $3400000.00 Lowest Capacity Asset GC XFO1EI4768PP Portfolio Turnover 3.71% |
from AlgorithmImports import * from QuantConnect.DataSource import * class FutureOptionDataAlgorithm(QCAlgorithm): option_contract_by_underlying_future_contract = {} def initialize(self) -> None: self.set_start_date(2020, 1, 28) self.set_end_date(2020, 6, 1) self.set_cash(100000) self.universe_settings.asynchronous = True # Requesting data gold_futures = self.add_future(Futures.Metals.GOLD, Resolution.MINUTE) gold_futures.set_filter(0, 90) self.add_future_option(gold_futures.symbol, lambda universe: universe.strikes(-5, +5) .calls_only() .back_month()) def on_data(self, slice: Slice) -> None: for kvp in slice.option_chains: # 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].is_tradable] # 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.market_order(contract.symbol, 1) self.option_contract_by_underlying_future_contract[kvp.Key.underlying] = contract def on_securities_changed(self, changes: SecurityChanges) -> None: for security in changes.added_securities: if security.type == SecurityType.FUTURE_OPTION: # Historical data history = self.history(security.symbol, 10, Resolution.MINUTE) self.debug(f"We got {len(history)} from our history request for {security.symbol}")