| Overall Statistics |
|
Total Trades 44 Average Win 0% Average Loss 0% Compounding Annual Return 473.071% Drawdown 5.100% Expectancy 0 Net Profit 4.899% Sharpe Ratio 11.477 Probabilistic Sharpe Ratio 70.044% Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 1.643 Beta 2.116 Annual Standard Deviation 0.493 Annual Variance 0.243 Information Ratio 8.523 Tracking Error 0.441 Treynor Ratio 2.673 Total Fees $81.40 Estimated Strategy Capacity $2700000.00 |
from datetime import datetime, timedelta
from QuantConnect.Algorithm import *
from QuantConnect.Data import *
from QuantConnect import *
class WTICrudeOilFuturesOptionsChainProviderAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 5, 1)
self.SetEndDate(2020, 5, 10)
self.SetCash(1000000)
# METHOD 2 -- using the OptionChainProvider
#
# This method should ideally only be used when you are dealing
# with single futures contracts that have not had their option chain
# loaded. The OptionChainProvider will return a list of all options
# tradable for the future contract at a given date.
#
# ---------------------------
#
# We need to add a specific future contract first, since
# the OptionChainProvider expects a specific future contract.
cln20 = Symbol.CreateFuture("CL", Market.NYMEX, datetime(2020, 6, 22))
cln20 = self.AddFutureContract(cln20, Resolution.Minute).Symbol
# Loads all Futures Options contracts on 2020-05-01 for CLN20.
# Note that this result will not be updated as the algorithm progresses.
allContractsCLN20 = self.OptionChainProvider.GetOptionContractList(cln20, self.Time)
# We can add the contracts here, but once they expire, no more new contracts
# will be added to the algorithm, unless we do all of this again.
for clOptionContract in allContractsCLN20:
self.AddFutureOptionContract(clOptionContract, Resolution.Minute)
def FilterFutureOptionContract(self, filterUniverse):
return filterUniverse.Strikes(-5, +5)
def OnData(self, data):
if self.Portfolio.Invested:
return
# Loop through all futures options contracts that were loaded.
# We long calls, and short the puts that were loaded.
for chain in data.OptionChains.Values:
for contract in chain.Contracts.Values:
# The contract's strike, right, and style can all be accessed
# from the `Symbol` object as well, if you don't have access
# to the `OptionContract` object.
#
# strike: contract.Symbol.ID.StrikePrice
# right: contract.Symbol.ID.OptionRight
# style: contract.Symbol.ID.OptionStyle
#
if contract.Right == OptionRight.Call:
# Buy 1 CL call contract
self.MarketOrder(contract.Symbol, 1)
else:
# Short 1 CL put contract
self.MarketOrder(contract.Symbol, -1)