Overall Statistics |
Total Trades 2 Average Win 72.85% Average Loss 0% Compounding Annual Return 827.734% Drawdown 6.500% Expectancy 0 Net Profit 72.846% Sharpe Ratio 2.738 Probabilistic Sharpe Ratio 96.586% Loss Rate 0% Win Rate 100% Profit-Loss Ratio 0 Alpha 2.448 Beta -0.567 Annual Standard Deviation 0.866 Annual Variance 0.751 Information Ratio 2.533 Tracking Error 0.884 Treynor Ratio -4.181 Total Fees $114.00 |
import datetime import matplotlib.pyplot as plt import pandas as pd from System import * from QuantConnect import * from QuantConnect.Algorithm import * class BasicTemplateOptionsAlgorithm(QCAlgorithm): def Initialize(self): self.SetCash(100000) self.SetStartDate(2018, 4, 1) self.SetEndDate(2018, 6, 30) self.optionData = {} # def init_option(season_tickets, self): # for ind, row in season_tickets.iterrows(): # option = self.AddOption(row[0], Resolution.Minute) # symbol = option.Symbol # if symbol not in self.optionData: # self.optionData[symbol] = OptionData(symbol) # self.optionData[symbol].add_eps(row[6],row[5],row[4]) # #download EPS csv file from google drive and creating dataframe # url = "https://www.dropbox.com/s/4vtx2nn6jzty7lc/CND%20EPS%20data.csv?dl=1" # file = self.Download(url).split("\n") # extract_data = [x.split(',') for x in file] # EPS_data = pd.DataFrame(extract_data) # EPS_data.columns = EPS_data.iloc[0] # EPS_data = EPS_data.drop(EPS_data.index[0]) # EPS_data = EPS_data.drop(EPS_data.index[len(EPS_data)-1]) # init_option(EPS_data, self) # Example Option option = self.AddOption("AAPL", Resolution.Minute) symbol = option.Symbol if symbol not in self.optionData: self.optionData[symbol] = OptionData(symbol) self.optionData[symbol].add_eps(2018, 5, 1) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(10,00), self.BuyCall) self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.At(9,45), self.ClosePositions) def BuyCall(self): if self.Portfolio.Invested: return symbolsToTrade = [] for symbol, data in self.optionData.items(): earnings = data.dates if self.Time.date() in earnings: symbolsToTrade.append(symbol) for kvp in self.CurrentSlice.OptionChains: if kvp.Key in symbolsToTrade: chain = kvp.Value # we sort the contracts to find at the money (ATM) contract with farthest expiration contracts = sorted(sorted(sorted(chain, \ key = lambda x: abs(chain.Underlying.Price - x.Strike)), \ key = lambda x: x.Expiry, reverse=True), \ key = lambda x: x.Right) # if found, trade it if len(contracts) == 0: continue symbol = contracts[0].Symbol # Divide total available buying power amongst symbols traded cashAllocated = self.Portfolio.MarginRemaining / len(symbolsToTrade) # Price per share for contract price = self.Securities[symbol].Close # Size of position given dollar amount for position size = int(cashAllocated/(price*100)) self.MarketOrder(symbol, size) def ClosePositions(self): if self.Portfolio.Invested: self.Liquidate() class OptionData: def __init__(self, symbol): self.symbol = symbol self.dates = [] def add_eps(self, year, month, day): date = datetime.date(year, month, day) self.dates.append(date)